jni使用指南,关于.so你应该知道的

其实这些都是Android设备CPU的:

  • armeabi: 早期的手机用的比较多,针对普通的或旧的arm v5 cpu,。
  • armeabiv-v7a:目前主流版本 2011年以后的生产的大部分设备,针对有浮点运算或高级扩展功能的arm v7 cpu.
  • arm64-v8a: 8代、64位ARM处理器,64位支持.
  • x86: 我们见到的模拟器大多就是这个。
  • x86_64: 64位的平板。

然后特意说一下x86系列的,是兼容arm的,但是性能损失特别大.

Android加载.so的原则
同一目录下要么所有使用jni的项目都给加上.so文件,
要么你就别给这个目录,也就是只要不齐全就都干掉
比如你的lib结构是这样的

libs
  -armeabi
      -aaa.so
      -bbb.so
  -arm64-v8a
      -aaa.so

其实这种情况就是属于同一目录下,提供的.so文件不全...然而很容易出现,毕竟有些三方啊什么的,提供的.so文件并不齐全,这样的话同一个架构目录下会缺少一个或多个.so文件.

Android在加载某个使用jni的功能时,你并没有提供x86的.so文件,但是你有x86这个目录,那就会去x86目录下去找,没有啊然后就异常了.

Android加载.so的目录
1.我自己用的是

jni使用指南,关于.so你应该知道的_第1张图片
Snip20170309_1.png

也就是自己在app -> src -> main 下自己建立一个目录: jniLibs
然后放进去即可.

2.就是通常放在libs目录下了
别忘了在build.gradle文件中设置 jniLibs.srcDir

Android排除某架构的.so

android {
    ...

    defaultConfig {    
        ...
        ndk {
            // 设置支持的 SO 库构架
            abiFilters 'armeabi', 'armeabi-v7a'     // 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64'
        }
    }   
}

如果编译报

NDK integration is deprecated in the current plugin.

gradle.properties 文件中添加:

android.useDeprecatedNdk=true

应该还有其他方法排除,我也就知道这一种,如果有知道其他方法的,请告知一下,谢谢

你可能感兴趣的:(jni使用指南,关于.so你应该知道的)