工具:AndroidStudio 2.3.3

第一步:新建工程 JniTest

初学JNI流程,SayHelloWorld (AndroidStudio)

第二步:检查是否下载了ndk

初学JNI流程,SayHelloWorld (AndroidStudio)

如果没有下载可以去官网下载也可以直接在线更新下载(如图在线下载),下载完之后再Android NDK location中配置一下路径即可

初学JNI流程,SayHelloWorld (AndroidStudio)

如果配置没有错误的话,可以在local.properties中看到你的配置路径

初学JNI流程,SayHelloWorld (AndroidStudio)

第三步:新建一个类,主要作用是加载so库和声明native方法

初学JNI流程,SayHelloWorld (AndroidStudio)

使用cmd命令或者Terminal终端来编译JniTest类

①先生成 .class文件

cmd命令        G:\PandaSpace3\JniTest\app\src\main\java\fans\zy\com\jnitest>javac JniTest.java

②再生成 .h头文件

cmd命令        G:\PandaSpace3\JniTest\app\src\main\java>javah fans.zy.com.jnitest.JniTest

注意两条命令的不同之处,不然会报错找不到xxx类

初学JNI流程,SayHelloWorld (AndroidStudio)

第四步:新建一个jni文件夹,新建一个 .c文件,随便取名(main.c),把.h里面的内容复制进去,并实现里面函数

             (在这里我直接将.h文件复制到jni文件夹中,重命名),JNIEnv的用法可以自学一下。

初学JNI流程,SayHelloWorld (AndroidStudio)

第五步:在 build.gradle文件中的defaultConfig节点里添加一下代码 

moduleName 即我们要加载的so库名字

ndk {
    moduleName "MyJni"   
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}
还要在gradle.properties里面加上这么一句话android.useDeprecatedNdk=true
初学JNI流程,SayHelloWorld (AndroidStudio)

rebuild一下会在 app/build/intermediates/ndk/debug/lib下生成so库文件

初学JNI流程,SayHelloWorld (AndroidStudio)

rebuild的之后可能会报错

初学JNI流程,SayHelloWorld (AndroidStudio)

原因:Android NDK从r16 beta1开始,不再支持 ARM5 (armeabi)。默认情况下,Android NDK不会构建ARM5版本。

ndk {
    moduleName "MyJni"   
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}

去掉 "armeabi"就不会报错了

最后一步,新建JNILib文件夹,拷贝lib下生成的所有so库文件

初学JNI流程,SayHelloWorld (AndroidStudio)

在MainActivity中调用

初学JNI流程,SayHelloWorld (AndroidStudio)

运行崩溃,为什么呢?

原因是 在defaultconfig节点中 ,so库的名字 (moduleName “MyJni”),而在JniTest类中

static {
    System.loadLibrary("JniTest");,so库文件名不一致,将其改为MyJni就OK了
}

相关文章: