工具:AndroidStudio 2.3.3
第一步:新建工程 JniTest
第二步:检查是否下载了ndk
如果没有下载可以去官网下载也可以直接在线更新下载(如图在线下载),下载完之后再Android NDK location中配置一下路径即可
如果配置没有错误的话,可以在local.properties中看到你的配置路径
第三步:新建一个类,主要作用是加载so库和声明native方法
使用cmd命令或者Terminal终端来编译JniTest类
①先生成 .class文件
cmd命令 G:\PandaSpace3\JniTest\app\src\main\java\fans\zy\com\jnitest>javac JniTest.java
②再生成 .h头文件
cmd命令 G:\PandaSpace3\JniTest\app\src\main\java>javah fans.zy.com.jnitest.JniTest
注意两条命令的不同之处,不然会报错找不到xxx类
第四步:新建一个jni文件夹,新建一个 .c文件,随便取名(main.c),把.h里面的内容复制进去,并实现里面函数
(在这里我直接将.h文件复制到jni文件夹中,重命名),JNIEnv的用法可以自学一下。
第五步:在 build.gradle文件中的defaultConfig节点里添加一下代码
moduleName 即我们要加载的so库名字
ndk { moduleName "MyJni" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }
还要在gradle.properties里面加上这么一句话: android.useDeprecatedNdk=true
rebuild一下会在 app/build/intermediates/ndk/debug/lib下生成so库文件
rebuild的之后可能会报错
原因:Android NDK从r16 beta1开始,不再支持 ARM5 (armeabi)。默认情况下,Android NDK不会构建ARM5版本。
ndk { moduleName "MyJni" ldLibs "log", "z", "m" abiFilters "armeabi", "armeabi-v7a", "x86" }
去掉 "armeabi"就不会报错了
最后一步,新建JNILib文件夹,拷贝lib下生成的所有so库文件
在MainActivity中调用
运行崩溃,为什么呢?
原因是 在defaultconfig节点中 ,so库的名字 (moduleName “MyJni”),而在JniTest类中
static { System.loadLibrary("JniTest");,so库文件名不一致,将其改为MyJni就OK了 }