手把手教你开发jni_java

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

手把手教你开发jni_java_02手把手教你开发jni_java_03手把手教你开发jni_java_04手把手教你开发jni_java_05

 

手把手教你开发jni_java_06

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

 

手把手教你开发jni_java_07手把手教你开发jni_java_08

 

01

ndk的下载安装&配置        

 

 

 

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

第一:Androidstudio中在线下载安装:这个还是很简单的,我是在用到jni时提示我需要ndk,然后点击安装,速度很快,而且Androidstudio中需要配置ndk的一些gradle文件中也会连带着给配置了,很方便。

第二:下载到本地/安装: 如果这么做也就表示你要做一下几步:

 

第一步:下载ndk

首先你要在网上找到ndk的下载地址:https://developer.android.google.cn/ndk/downloads/index.html

 

第二步:正确安装

软件安装这个不再多说....

 

第三步:配置ndk

在Androidstudio中像配置jdk一样配置ndk。打开as-->file-->Project structure配置ndk的路径,如下图所示

手把手教你开发jni_java_09

第四步:开发配置

配置gradle.properties 文件,目录结构选择project,配置project的gradle.properties文件

手把手教你开发jni_java_10

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

手把手教你开发jni_java_11

第五步:开发配置

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

手把手教你开发jni_java_12

 

02

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命令进行手动编译。

 

 

 

02

开发JniDemo

 

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

1

新建java文件: 在src\main\java\com\android\jnidemo目录下新建JniUtils.java

手把手教你开发jni_java_13

 

 

2

生成.h文件:该步分为两步,第一找到JniUtils.class所在路径,第二在as的terminal终端中执行javah命令,生成对应的.h文件。

 

01

手把手教你开发jni_java_14找到class的路径

JniUtils.class路径:E:\zrf\project\as_project\JniDemo\app\build\intermediates\classes\debug\com\android\jnidemo\JniUtils.class。

手把手教你开发jni_java_15

JniUtils.java的文件内容为:

手把手教你开发jni_java_16

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

 

02手把手教你开发jni_java_17生成.h文件

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

手把手教你开发jni_java_18

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

手把手教你开发jni_java_19

.h文件内容为:

手把手教你开发jni_java_20

 

 

 

3

新建.c文件

在jni目录下新建.c文件,命名无所谓,内容仿照.h文件来:

手把手教你开发jni_java_21

 

 

4

新增Android.mk文件

在jni目录下新增Android.mk文件(选定jni目录后右键-file(在填写file的name时添加mk后缀)),mk文件内容为:

手把手教你开发jni_java_22

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

 

 

5

新增Application.mk文件

手把手教你开发jni_java_23

在jni目录下新增Application.mk文件(同android.mk文件),文件内容如上

 

 

 

6

配置buld_grdle

接下来就是配置编译环境了:

手把手教你开发jni_java_24手把手教你开发jni_java_25

需要配置两大部分,参考图中注释可以看出各部分有何含义。注意,如果你在gradle中配置了jni.srcDirs,那么as就不会自动生成so库了,所以如果想要as自动生成so文件,千万不要进行如上配置:说这个是因为很多文章直接写出了这个配置,误导了很长时间。。。

 

 

 

 

7

so文件的位置

生成的so文件的位置为 :

E:\zrf\project\as_project\JniDemo\app\build\intermediates\ndkBuild\debug\obj\local\armeabi

手把手教你开发jni_java_26

 

 

 

 

 

04

Demo验证

 

 

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

手把手教你开发jni_java_27

验证结果:

手把手教你开发jni_java_28

https://mp.weixin.qq.com/s/WVbU61oDH_lRosWHOhO_uQ