我不是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-v8a
和armeabi-v7a
,x86_64
和x86
,或x86
和armeabi-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")
}
}
}