最近项目需要用到NDK编程,要学会如何在AS里调用 jni ,走了不少坑,下面就把自己的心路历程写下来,做个记录。
第一步,下载NDK ,建议下载 最新的包,android-ndk-r12b ,开始用了r10b的包编译的时候有点问题,点击下贼链接:点我点我
第二步,新建一个项目 NdkDemo,项目grade配置有点不一样 下面看图:
这里gradle版本 不能用正常gradle编译 ~·有待研究,这里之前漏了,下文就找了半天的错
第三步,新建一个类Test,看下代码:
public class Test {
public native String getMsg();
}
报错红字 可以忽略 ,直接 make project. 通过了就行
在项目 app/build/intermediates/classes/debug 目录下找到 刚才生成的 class 文件,请注意不是.java
然后 cmd 命令 进入 这个目录
这个命令的格式是 javah -classpath .-jni com.xxx.xx.Test
如果看到 无输出 东西 ,那就拍手鼓掌了,我一直是 下面那个图
这里是关键点了,我试了好久 ,才发现 自己ClassPath环境没配置,坑爹啊
第四步:上面通过的话 会生成com_xxx_xxx_Test.h的 C的头文件
自己在app/main/java同级建一个jni文件夹,把上面的C文件 剪切过来,然后 建一个XXX.C文件 ,这个就是c的代码库 代码如下
#include "com_live_ndkdemo_Test.h"
JNIEXPORT jstring JNICALL Java_com_live_ndkdemo_Test_getMsg(JNIEnv *env,jobject obj){
return (*env)->NewStringUTF(env,"我是来自 JNI");
}
做到这步,回过头在把gradle配置文件 改下,Test类导入so库 即可
android.ndk {
moduleName = "test"
ldLibs += "log"
abiFilters += "armeabi"
abiFilters += "armeabi-v7a"
abiFilters += "x86"
}
public class Test {
public native String getMsg();
static {
System.loadLibrary("test");
}
}
然后自己编译成 apk ,然后解压下 就能看的 三个平台so库了~
——坑都是自己走出来才记忆深刻~待续