专栏首页编程思想之路Androidstudio编译c/c++jni方法

Androidstudio编译c/c++jni方法

开发环境:Androidstudio2.3 开发目的:在Androidstudio上编译c/c++jni并自动生成so库,在java类中引用。 开发过程中遇到的问题很多,但终归是成功了,记录下来用Androidstudio的准备 遇到的问题诸如:

再比如

最后当问题结束后,so包一直不出来。 好不容易so包打出来了,java文件却提示找不到,我也是无语了。但幸好问题一个一个的解了

ndk的下载安装&配置

对于ndk的下载有两种方式:

  • Androidstudio中在线下载安装:这个还是很简单的,我是在用到jni时提示我需要ndk,然后点击安装,速度很快,而且Androidstudio中需要配置ndk的一些gradle文件中也会连带着给配置了,很方便。
  • 下载到本地/安装: 如果这么做也就表示你要做一下几步:
    • 下载ndk, 首先你要在网上找到ndk的下载地址:ndk下载地址
    • 正确安装
    • 在Androidstudio中配置ndk的路径:file-Project structure
    • 配置gradle.properties文件:目录结构选择project,配置project的gradle.properties文件

    在该文件中添加android.useDeprecatedNdk=true,如下图所示:

    • 配置local.properties文件,文件目录和所修改的gradle.properties同级。添加ndk的声明引用ndk.dir=E\:\\zrf\\tools\\work\\installed\\Android\\sdk\\ndk-bundle 如下图所示:

ndk的环境变量

对于ndk,需要在环境变量Path中声明:

  1. 首先定义一个变量NDK_ROOT,指向ndk的安装路径:E:\zrf\tools\work\installed\Android\sdk\ndk-bundle
  2. 在path中添加声明ndk的变量%NDK_ROOT%;

其实你定义的变量名字是什么都无所谓,只要保证path中包含ndk的安装路径即可。 定义环境变量的意义就是可以在cmd中使用ndk-build命令进行手动编译。

开发JniDemo

经过以上两步后,ndk的环境搭建基本就完成了,接下来就是demo验证了:

  1. 新建java文件: 在src\main\java\com\android\jnidemo目录下新建JniUtils.java
  1. 生成.h文件:该步分为两步,第一找到JniUtils.class所在路径,第二在as的terminal终端中执行javah命令,生成对应的.h文件。
    • JniUtils.class路径:E:\zrf\project\as_project\JniDemo\app\build\intermediates\classes\debug\com\android\jnidemo\JniUtils.class

    JniUtils.java的文件内容为:

    在该文件中System.loadLibrary用于加载so文件,这里不需要so后缀,也不需要加lib前缀

    • 在终端执行命令生成.h文件:javah -d classpath E:\zrf\project\as_project\JniDemo\app\build\intermediates\classes\debug com.android.jnidemo.JniUtils.class 注意该命令在debug后有空格,命令之所以这么写是跟jni的名字命名有关。

    运行命令后,可以看到在src/main/目录下自动生成了jni文件夹,文件夹中有一个文件

    .h文件内容为:

  2. 在jni目录下新建.c文件,命名无所谓,内容仿照.h文件来:
  1. 在jni目录下新增Android.mk文件(选定jni目录后右键-file(在填写file的name时添加mk后缀)),mk文件内容为:

在mk文件中有两个参数需要注意,一是LOCAL_MODULE:声明的为jni模块名,即所生成的so文件的名称。二是LOCAL_SRC_FILES:为.c文件相对mk文件的路径。

  1. 在jni目录下新增Application.mk文件(同android.mk文件),文件内容如下:
  1. 配置buld_grdle:接下来就是配置编译环境了:

需要配置两大部分,参考图中注释可以看出各部分有何含义。 注意,如果你在gradle中配置了jni.srcDirs,那么as就不会自动生成so库了,所以如果想要as自动生成so文件,不要进行如下配置:

  1. 生成的so文件的位置为 :E:\zrf\project\as_project\JniDemo\app\build\intermediates\ndkBuild\debug\obj\local\armeabi

demo验证

在本应用中使用应用内的jni进行验证 在MainActivity中调用JniUtils中的native方法进行验证:

验证结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用Androidstudio开发Java工程图文详解

    作为一名安卓开发工作者,有时候希望可以借助简单的Java程序来验证或测试一些代码,目前Androidstudio开发工具越来越火,但是很遗憾在使用了as一年后才...

    fanfan
  • Android源码开发之添加/删除系统应用

    本文参考老罗的系统源代码情景分析中的1.5章节 http://0xcc0xcd.com/p/books/978-7-121-18108-5/c15.php 想要...

    fanfan
  • ubuntu系统上配置git

    1,首先第一步检查一下本机是否已经安装了git 随便到一个git目录下执行git status或者其他git命令,如果本机没有安装,则会提示你去安装,ubunt...

    fanfan
  • PHP面向对象——三大基本特性与五大基本原则

    所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

    猿哥
  • Linux系统常用命令总结

    1. 最关键的命令 man echo 2. 目录文件操作命令 ls: 查看目录下的文件信息或文件信息 dir: pwd: 打印当前路径 cd:改变路径 mkdi...

    llhthinker
  • 面向对象的三大基本特性,五大基本原则

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

    大黄大黄大黄
  • 【python】os 模块使用笔记

    Python内置的os模块可以调用操作系统提供的接口函数,对文件或目录进行操作(实际上操作系统是不允许应用程序直接访问和操作文件和目录的,读写文件就是请求操作系...

    zenRRan
  • 谷歌欲借人机合作消除网络极端主义内容

    一直以来,谷歌在打击网络极端分子上面临着极大的压力。据外媒报道,谷歌对这种压力进行了回应。谷歌概述了其在网页、尤其是YouTube上标记和删除支持极端主义内容的...

    人工智能快报
  • iOS开发中的并发、串行队列,同步、异步任务

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • 商业分析与数据分析、算法模型的关系与区别

    我们常说,办事情要“名正言顺”,而数据领域的名字则是格外的多,商业分析、数据分析、数据挖掘、算法模型……经常把大家绕晕,今天系统科普一下。

    接地气的陈老师

扫码关注云+社区

领取腾讯云代金券