搞安卓也有2年了,不过JNI一直都没接触过。最近项目需求需要用到这方面,所以上网搜了下相关的资料。搞了一上午,借鉴别人的东西,出了几个小问题,终于弄好了。
1,首先你得在项目里配置好NDK的路径。这我就没必要截图了。
2 先写一个工具类,用来加载so库以及native方法(尽管这时候还没有so库)
在这里我定义了两个方法,一个返回int类型,一个返回String类型。
3 接下来便是生成h文件,也就是头文件.这里是利用javah生成。
首先进入Terminal窗口
进入debug下的classes目录
cd app/build/intermediates/classes/debug
第二部就是生成h文件了
输入 javah -jni qj.hellojni.TestJni
注意路径要完整
输入之后,你就会在app/build/intermediates/classes/debug这个路径下发现一个h文件,复制到jni目录下。这个jni目录需要你自己在main文件夹下创建。如下图
h头文件的内容是这样的。
4 创建相应的cpp文件。
方法名我是直接从h文件复制过来的。接下来实现相应的方法就好了。
写完cpp之后,还需要在gradle中配置一下。
设置允许使用ndk
还需要设置so的名字,注意要与之前system.loadlibrary名字对应
编译的时候遇到个问题,第一个方法没错误。有错误的是第二个方法。
第二个方法刚开始的时候是写
(*env)->NewStringUTF(env, "Hello from JNI !");
结果报错了,错误信息为
error: base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'
env->NewStringUTF("laizhijni");
改了之后,终于可以调用这两个方法了。