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-v8a
和 armeabi-v7a
,或 x86_64
和 x86
,或 x86
和 armeabi-v7a
(通过仿真)。在安装时,它会查看包含哪些架构,从中选择最喜欢的架构,并安装该架构中的所有库,忽略其余架构。 (较旧的 Android 版本可能无意中在所描述的情况下显示出略有不同、不一致的行为 - 请参阅 。)
现在,如果您包含的库之一出现在所有可用架构的构建中,而另一个仅支持少数几个,则安装程序可能会选择例如arm64-v8a
,因此无法获得所有必需的库。
因此,您只能支持所有库提供的体系结构的交集。
为此,您可以从提供更多架构的 SDK 中手动删除多余的目录,或者如果使用 Gradle 构建您的 APK,您可以将其添加到 NDK 块中:
abiFilters 'armeabi-v7a', 'x86'
我对 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-v8a
和 armeabi-v7a
,或 x86_64
和 x86
,或 x86
和 armeabi-v7a
(通过仿真)。在安装时,它会查看包含哪些架构,从中选择最喜欢的架构,并安装该架构中的所有库,忽略其余架构。 (较旧的 Android 版本可能无意中在所描述的情况下显示出略有不同、不一致的行为 - 请参阅 。)
现在,如果您包含的库之一出现在所有可用架构的构建中,而另一个仅支持少数几个,则安装程序可能会选择例如arm64-v8a
,因此无法获得所有必需的库。
因此,您只能支持所有库提供的体系结构的交集。
为此,您可以从提供更多架构的 SDK 中手动删除多余的目录,或者如果使用 Gradle 构建您的 APK,您可以将其添加到 NDK 块中:
abiFilters 'armeabi-v7a', 'x86'