【发布时间】:2018-09-20 13:16:09
【问题描述】:
我做一些涉及 OpenSSL 的原生 Android 开发。
我使用 Android NDK 独立工具链为 armeabi (32b) 交叉编译它。我交叉编译本机 C 库,将 OpenSSL/本机库 .so 文件复制到我的 libs/ 文件夹中,我的 gradle 以这种方式引用该文件夹:
sourceSets {
main {
jniLibs.srcDir(file("libs/"))
}
}
不管怎样,最终结果是我的.apk 看起来像这样:
- > classes.dex
- > lib/
-> armeabi/
-> libcrypto.so
-> libssl.so
-> libmynativelibrary.so
- > res/ (...)
- > resources.arsc
- > META-INF/ (...)
- > kotlin/ (...)
- > AndroidManifest.xml
共享库是正确的 32 位 ARM ELF 文件。我一直在 API 级别 24 的设备(Android 7.0+)上使用这个精确的 APK。
问题:当我切换到 API 级别 21 设备(Android 5.1-,我怀疑我会在 Android 6.0 上遇到同样的问题)时,程序在加载时立即崩溃 libmynativelibrary.so .
由于libcrypto.so 是libmynativelibrary.so 的依赖项,因此程序会尝试加载它。它实际上在 API 级别 24+ 上运行良好,但在 API 级别 23- 上崩溃。这是因为加载的库不是我的.apk 中的库,而是系统中的库。 And such libraries seem to not be available below API level 24.
我的问题:如何明确告诉 Android 首先在 .apk 文件中查找库而不是常规系统库目录?
提前致谢。
【问题讨论】:
标签: android-ndk android-gradle-plugin