jni网上资料挺多的。好吧好吧,感觉坑点有点多。敢不敢写的详细点啊。只能自己写写了。
首先就是先创建一个项目了。这个不用说了。然后新建一个类。写一个native 方法 ,如
public class JniTest { public native String getHelloJniString(); }然后build make project项目。我们从build/intermediates/classes/debug 中就能找到JniTest.class 文件了。如果没有生成,那就是你项目报错了。处理一些重新build项目即可。
这里就要用到命令行了。找到AS下的Terminal 然后进入到你的module中,如 cd myjnitest/src/main/java 中。使用javah - jni com.jnitest.JniTest 命令。
这样就会生成一个.h的头文件。把它复制到main下的jni文件夹中(没有jni文件夹就创建一个)。
然后在jni下你可以自己写一个.c的文件。简单点如这样
自动会在jni下生成一个jnitest.c文件。简单的改写一下如下:
#include <jni.h> JNIEXPORT jstring JNICALL Java_test_com_myjnitest_JniTest_getHelloJniString(JNIEnv *env, jobject instance) { return (*env)->NewStringUTF(env, "JNI TEST"); }然后在 MainActivity我们加入
static { System.loadLibrary("jni"); }
在gradle加入
ndk{ moduleName "jni" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" }
这里的ndk中的名称和static块中的名称要一致。
然后就是调用了。如下:
s = (TextView) findViewById(R.id.s); s.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { JniTest j = new JniTest(); s.setText(j.getHelloJniString()); } });
这时候成不成功就要看你的API了。如果你使用了API 25的话,你中奖了。会报这样的错误,楼主亲测:
Android NDK: Aborting . Stop.
改一下API,重新编译一下就ok了。原因查资料说不支持API 25.
你会发现在build/intermediates/ndk/debug/ 中生成了.so文件。复制出来就可以用了。大功告成!
这里的槽点也是我的槽点,书写c文件的时候因为c语法不精,出现的问题。还是挺简单的。