JNI入门,使用NDK编写自己的SO库

来源:互联网 发布:mac层随机竞争算法 编辑:程序博客网 时间:2024/06/05 23:13

很多时候我们开发会使用到第三方的.so文件,这个.so文件是如何生成的呢?当然和NDK有关了,其实NDK开发的一般步骤很简单,只需简单的几步就可完成。

一、和使用JDK开发一样,想要使用NDK开发,首先必须得下载NDK

studio里面可以直接下载ndk
如何下载NDK

下载好了之后在你的local.properties路径配置中自动会加上NDK路径(与SDK的添加路径一样)
local.properties本地配置会自动添加ndk路径

二、在gradle.properties的配置中添加

android.useDeprecatedNdk=true //允许使用过时的NDK
这是解决ndk版本低不能自动编译jni的问题
解决ndk版本低的问题

三、在build.gradle配置中添加

gradle相关配置

四、生成.so文件

1、编写java类和native方法
加载so文件,编写native方法

2、点击Build—>Make Project,生成class文件(在app—>build—>intermediates—>classes—>debug目录下)
找到native的class文件

3、在studio底下菜单中的Terminal命令行中通过javah命令生成.h头文件
命令生成.h头文件
注意:路径只能切换到cd debug目录,不能直接将目录切到项目里面,比如cd xxx/org/hugh/jni,不行!

此时,debug目录下会生成.h文件
生成的.h头文件

4、将.h头文件剪切到新建的jni目录中,在jni目录中新建一个.c或者.cpp文件,生成.so库
新建jni目录
新建jni文件目录

将之前生成的.h文件剪切到jni目录中
将生成的.h文件剪切到此目录中

在jni目录中新建一个.c或者.cpp文件

编写getAuthorName的jni代码

点击Build—>Make Project进行编译,生成.so库文件(路径:app—>build—>intermediates—>ndk—>debug—>lib下)
生成的.so文件
可以将这些.so文件拷贝出来

将含有JniUtil.java的jar拷贝出来,可以给classes.jar重命名(这里也可以通过gradle的task来执行)
将jar包拷贝出来

五、在新建项目中使用.so文件

将生成的.so文件和调用so方法的jar包复制到新项目的lib文件夹中
拷贝生成的.so文件

gradle中配置so库的存放位置
gradle中配置jni使用目录

这样就可以调用了
调用jni

运行结果
调用jni的运行结果

一般调用.so文件的类都会打包成jar包提供出来(比如调用.so文件的JniUtil类),这是因为.so文件中的方法是严格按照包名及类名来命名的。