一、android studio JNI 的简单编写使用。

来源:互联网 发布:淘宝助手数据包 编辑:程序博客网 时间:2024/05/23 14:33

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语法不精,出现的问题。还是挺简单的。