Android:包括针对不同架构的 ndk .so 库,应用程序崩溃

Android: including ndk .so libraries for different architectures, app crashes

我对 Android 开发并不陌生,但在谈到 NDK 和 .so 库时我完全是个新手。

我正在构建的应用程序使用第三方 SDK,它们提供了一些 .so 文件。他们为我提供了每个架构的 .so 文件(到目前为止:arm64-v8a、armeabi、armeabi-v7a、mips、mips64、x86、x86_64)。

我需要包含一个新的第三方 SDK,但他们只为 armeabi-v7a 和 x86 提供 .so 文件。 当我尝试 运行 我的应用程序时,它崩溃了,我从 SDK 中收到错误(我在 logcat 上看到它),指出:

SDKNAME currently only provides prebuilt library for armeabi-v7a and x86 architectures

这是常见的情况吗?有没有办法解决这种情况?

非常感谢

将您编译的库存储在 app/src/main/jniLibs/{arch} 中,例如:armeabi/armeabi-v7a 然后将 post 末尾的行添加到您的应用 build.gradle .

productFlavours 用于配置编译变体,因此您可以 link 正确地编译库。

android.ndk {
        moduleName = "your_library_jni"
        cppFlags.add("-fexceptions")
        cppFlags.add("-std=c++11")
        cppFlags.add("-I" + file("src/main/jni").absolutePath)
        }

android.productFlavors {
        create("x86") {
            ndk.with{
                abiFilters.add("armeabi")

                File curDir = file('./')
                curDir = file(curDir.absolutePath)
                String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"

                ldLibs.add(libsDir + "libyour_module.so")

            }
        }
        create("arm-v7a") {
            ndk.with {
                abiFilters.add("armeabi-v7a")

                File curDir = file('./')
                curDir = file(curDir.absolutePath)
                String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/"

                ldLibs.add(libsDir + "libyour_module.so")

            }
        }
    }

您需要为您的应用程序支持的所有体系结构提供所有库。

安装 APK 后,安装程序会扫描 APK 以了解其支持的架构。如果 APK 不包含本机代码,则它支持所有架构。但是,如果它确实包含本机代码,则它仅支持 APK 中包含的那些架构。大多数现代设备支持不止一种架构;例如,设备可能支持 arm64-v8aarmeabi-v7a,或 x86_64x86,或 x86armeabi-v7a(通过仿真)。在安装时,它会查看包含哪些架构,从中选择最喜欢的架构,并安装该架构中的所有库,忽略其余架构。 (较旧的 Android 版本可能无意中在所描述的情况下显示出略有不同、不一致的行为 - 请参阅 。)

现在,如果您包含的库之一出现在所有可用架构的构建中,而另一个仅支持少数几个,则安装程序可能会选择例如arm64-v8a,因此无法获得所有必需的库。

因此,您只能支持所有库提供的体系结构的交集。

为此,您可以从提供更多架构的 SDK 中手动删除多余的目录,或者如果使用 Gradle 构建您的 APK,您可以将其添加到 NDK 块中:

abiFilters 'armeabi-v7a', 'x86'