Android Studio中JNI使用的一些出现的错误及方法

错误一
出现 Error: NDK integration is deprecated in the current plugin.
在gradle.properties 文件里面添加 android.useDeprecatedNdk=true 后重新编译即可
错误二
Native method not found: libs 里面的 so 文件没有被识别到,JNI 找不到方法
添加:jniLibs.srcDirs = [‘libs’]
错误三
Native method not found: 里面的 so 文件没有被识别到,JNI 找不到方法
So文件位置放置错误,放到armeabi-v7a文件夹下,不要放到armeabi里面
错误四
android studio 打包so文件到apk
.so已经放到了libs\armeabi下 而且从打包好的apk里也能看到.so已经打包进去(解压apk文件,lib文件里边应该有相应的 .so文件) 但是安装apk后,在手机路径/data/data/com.test.test/lib下就是没有相应的.so文件
因为我的.so没有按照android标准命名,.so的名字必须有’lib’前缀 否则apk解压/安装到手机的时候不会把libs\armeabi下的.so拷贝到/data/data/com.test.test/lib下。比如原来我用的so名字是JNITest.so, 改为libJNITest.so后一切正常。
用loadLibrary调用的时候需要去掉lib前缀 System.loadLibrary(“JNITest”);
用load调用的时候需要写全路径名 且不能去掉lib前缀 因为这里是当成一个普通文件读取的 System.load(“/data/data/com.test.test/libJNITest.so”);

错误五
armeabi v7a 与armeabi区别
armeabi就是针对普通的或旧的arm cpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu。
Android从2.2开始支持armeabi-v7a
早期的Cortex-A系列处理器(A5、A7、A8、A9、A12、A15和A17)基于 ARMv7-A架构。
高通820 四核心ARMv8
三星Exynos 8890 ARM Cortex-A53
麒麟950 四核A72+四核A53
兼容和文件读取顺序
arm64-v8a是可以向下兼容的,其下有armeabi-v7a,armeabi ,armeabi-v7a向下兼容armeabi兼容得不够智能:对于一个cpu是arm64-v8a架构的手机,它运行app时,进入jnilibs去读取库文件时,先看有没有arm64-v8a文件夹:如果没有该文件夹,去找armeabi-v7a文件夹,如果没有,再去找armeabi文件夹,如果连这个文件夹也没有,就抛出异常 ,如果有arm64-v8a文件夹,那么就去找特定名称的.so文件,注意:如果没有找到,不会再往下(armeabi-v7a文件夹)找了,而是直接抛出异常
同时,为了避免引用的第三方库中有arm64-v8a的so文件导致64位机器仍然从arm64-v8a文件夹读取so文件,将非armeabi-v7a的so文件全部过滤掉:加入ndk .abiFilters

 defaultConfig {
        applicationId "xx.xx.x.xx"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 15
        versionName "1.2.7"
        multiDexEnabled true
        ndk {
            abiFilters  "armeabi-v7a"  // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,armeabi,arm-v8之类的so会被过滤掉)
        }
    }

错误六
如果你将.so和.a文件(动态和静态库)已经打包到了apk中,但是还是说找不到jni方法
然后在libs文件夹下建立armeabi-v7a文件夹,将libg****.so文件和lib****.a文件放到该目录下,将armeabi文件夹下的.so文件换个地方

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值