Android:包括用于不同架构的NDK .SO库,应用程序崩溃



我不是Android开发的新手,但是在谈论NDK和.SO库时,我是一个新手。

我正在构建的应用程序使用第三方SDK,它们提供了一些.so文件。他们为我提供了每个架构的.SO文件(到目前为止:ARM64-V8A,ARMEABI,ARMEABI-V7A,MIPS,MIPS64,X86,X86_64)。

我需要包括一个新的第三方SDK,但它们仅提供.SO ARMEABI-V7A和X86的文件。当我尝试运行应用程序时,它会崩溃,并且我从SDK(我在logcat上看到它)出现了一个错误:

sdkname 当前仅为 armeabi-v7a x86 Architectures

提供预制库

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

预先感谢

您需要将所有架构可用的所有库提供给您的应用程序支持。

安装APK时,安装程序会扫描APK的架构支持的内容。如果APK不包含本机代码,则支持所有架构。但是,如果它包含本机代码,则仅支持APK中包含的那些架构。大多数现代设备都支持多个架构。例如,设备可能支持arm64-v8aarmeabi-v7ax86_64x86,或x86armeabi-v7a(通过仿真)。在安装时,看起来包括哪些体系结构,选择其中最喜欢的体系结构,并从该体系结构中安装所有库,忽略其余的。(较旧的Android版本可能无意间显示出略有不同的,不一致的行为,例如描述的情况 - 请参见https://stackoverflow.com/a/a/25648943/3115956。)

现在,如果您包含的一个库是用于所有可用架构的构建中,而另一个仅支持一些库,则安装程序可能会选择,例如。arm64-v8a,因此没有获得所有必要的库。

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

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

abiFilters 'armeabi-v7a', 'x86'

将编译的库存储在应用程序/src/src/main/jnilibs/{acrabs/{aCh}例如:armeabi/armeabi/armeabi-v7a,然后在帖子末尾添加行添加到您的应用程序构建中.gradle。

产品Flodflavours用于配置编译变体,因此您可以正确地链接已编译的库。

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")
            }
        }
    }

最新更新