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

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

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

studio里面可以直接下载ndk
JNI入门,使用NDK编写自己的SO库

下载好了之后在你的local.properties路径配置中自动会加上NDK路径(与SDK的添加路径一样)
JNI入门,使用NDK编写自己的SO库

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

android.useDeprecatedNdk=true //允许使用过时的NDK
这是解决ndk版本低不能自动编译jni的问题
JNI入门,使用NDK编写自己的SO库

三、在build.gradle配置中添加

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

四、生成.so文件

1、编写java类和native方法
JNI入门,使用NDK编写自己的SO库

2、点击Build—>Make Project,生成class文件(在app—>build—>intermediates—>classes—>debug目录下)
JNI入门,使用NDK编写自己的SO库

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

此时,debug目录下会生成.h文件
JNI入门,使用NDK编写自己的SO库

4、将.h头文件剪切到新建的jni目录中,在jni目录中新建一个.c或者.cpp文件,生成.so库
新建jni目录
JNI入门,使用NDK编写自己的SO库

将之前生成的.h文件剪切到jni目录中
JNI入门,使用NDK编写自己的SO库

在jni目录中新建一个.c或者.cpp文件
JNI入门,使用NDK编写自己的SO库

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

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

将含有JniUtil.java的jar拷贝出来,可以给classes.jar重命名(这里也可以通过gradle的task来执行)
JNI入门,使用NDK编写自己的SO库

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

将生成的.so文件和调用so方法的jar包复制到新项目的lib文件夹中
JNI入门,使用NDK编写自己的SO库

gradle中配置so库的存放位置
JNI入门,使用NDK编写自己的SO库

这样就可以调用了
JNI入门,使用NDK编写自己的SO库

运行结果
JNI入门,使用NDK编写自己的SO库

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