【问题标题】:Android NDK : Compiling different JNI Modules (jniLibs) for different architecturesAndroid NDK:为不同的架构编译不同的 JNI 模块(jniLibs)
【发布时间】:2017-07-19 14:15:35
【问题描述】:

我在编译具有不同架构的 JNI 库的不同模块时遇到问题

Module jniOne:
    /jniLib/armeabi

&

Module jniTwo: 
    /jniLib/armeabi-v7a
    /jniLib/x86

两个模块不同,具有不同的 .so 文件。

现在的问题是当我在主应用程序一模块 jni 库中包含两个模块时,没有编译和获取 java.lang.UnsatisfiedLinkError

MainApp: 
    build.gradle
    compile project(':jniOne')
    compile project(':jniTwo')

如果我包含以上两个中的任何一个,那么应用程序运行完美。

那么我在这个 jniLib 编译中缺少什么?

【问题讨论】:

  • 你的目标架构是什么?如果 jniOnejniTwo 不通信,你可能会作弊并将 jniOne 的共享库放在 armeabi-v7a 下 (ABI 不兼容,但 Java 并不真正关心)。然后,您将能够在 armeabi-v7a 设备或模拟器上安装您的 APK。您可以将 abiFilters 添加到您的 build.gradle 中删除 x86 库。

标签: android android-ndk java-native-interface android.mk


【解决方案1】:

据我所知。在您的项目中所有具有 jniLibs 的模块都应该具有相同的 abiFilters jnilibs。

示例:

模块 jniOne: /jniLib/armeabi

模块 jniTwo: /jniLib/armeabi

在您的情况下,问题是 jniOne 创建 armeabi 而 jniTwo 创建 armeabi-v7a、x86。在运行时系统尝试从所有创建的文件夹中链接“so”文件。它在 armeabi 中找不到 JniTwo 'so' 文件,在 armeabi-v7a、x86 中找不到 JniOne 'so' 文件,并给出 UnsatisfiedLinkError。

另加:

ndk { abiFilters 'armeabi', 'armeabi-v7a', .... } 在你的项目和模块 gradles 的 defaultConfig 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多