自己学习了一下Android的NDK开发,在网上看了很多相关资料,也试着写一下,主要是记录一下,方便以后查阅,好了,开始进入学习吧.
首先是搭建NDK开发环境,AS已经方便了很多,我们只需进行少量修改即可.
那么我们就从创建工程开始吧,
首先创建一个jni工程 我的包是 encrypt.duojiankj.cn.jnitest
创建好后查看下你的AS有没有NDK开发环境(我的是快捷方式是eclipse,在工程名下按F12),进入到这个界面,查看Android NDK location:是否是空,我的已经下载完毕,没有下载的会有个下载链接,点击即可.
创建JniTest.java
public class JniTest {
static {
System.loadLibrary("jary");
}
public native String getString();
}
在工程下build.properties中添加 android.useDeprecatedNdk=true
在app下build.gradle下的defaultConfig下添加
ndk {
moduleName "jary" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86", "arm64-v8a" //输出指定四种abi体系结构下的so库。
stl "stlport_static" //打开.c 的 debug (此句是打开的debug的关键)
}
debug {
jniDebuggable true //此句不加在真机上 debug 不受影响,但是在虚拟机上不能 debug
}
在MainActivity中做如下修改;
tv = (TextView) this.findViewById(R.id.tv);
tv.setText(new JniTest().getString());
点击
生成.class文件
我的路径是:
F:\AndroidStudioProjects\JniTest\app\build\intermediates\classes\debug\encrypt\duojiankj\cn\jnitest
最重要的一步 然后生成.h文件
打开cmd,切换到项目所在的盘符下,我的是F盘(我的是win10,其他的盘符切换可能略有不同)
切到项目所在的main下
输入 javah -d jni -classpath 加上你的项目路径 注意:debug 之后有2个空格
然后在会生成jni文件夹及.h文件
编写jary.c文件
#include "encrypt_duojiankj_cn_jnitest_JniTest.h" //这里是.h文件的名子
JNIEXPORT jstring JNICALL Java_encrypt_duojiankj_cn_jnitest_JniTest_getString(JNIEnv *env ,jobject object){
return (*env)->NewStringUTF(env,"hello jni !!!!");
};
运行app
运行后会出现以下目录表示成功
到这里.so库就生成了,下面来说一下调用so库
复制出libjary.so文件
在需要调用的工程app\src\main\下新建jniLibs文件夹将.so文件复制进去
创建包,要与之前的包一致
编写调用代码(与之前的内容一致)
运行编译即可
如有疑问欢迎留言讨论