初学JNI流程,SayHelloWorld (AndroidStudio)

工具:AndroidStudio 2.3.3

第一步:新建工程 JniTest

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


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


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


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


使用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文件夹,新建一个 .c文件,随便取名(main.c),把.h里面的内容复制进去,并实现里面函数

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


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

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

ndk {
    moduleName "MyJni"   
    ldLibs "log", "z", "m"
    abiFilters "armeabi", "armeabi-v7a", "x86"
}
还要在gradle.properties里面加上这么一句话android.useDeprecatedNdk=true

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


rebuild的之后可能会报错


原因: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库文件

在MainActivity中调用


运行崩溃,为什么呢?

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

static {
    System.loadLibrary("JniTest");,so库文件名不一致,将其改为MyJni就OK了
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值