Android ndk 在运行时找不到apk中绑定的共享库

Android ndk 在运行时找不到apk中绑定的共享库,android-ndk,android-gradle-plugin,Android Ndk,Android Gradle Plugin,我做了一些原生的Android开发,涉及到OpenSSL 我使用Android NDK独立工具链为armeabi(32b)交叉编译它。我交叉编译本机C库,复制OpenSSL/本机库。因此文件位于我的libs/文件夹中,我的gradle以这种方式引用该文件夹: sourceSets { main { jniLibs.srcDir(file("libs/")) } } 无论如何,最终结果是my.apk如下所示: - > classes.dex - >

我做了一些原生的Android开发,涉及到OpenSSL

我使用Android NDK独立工具链为armeabi(32b)交叉编译它。我交叉编译本机C库,复制OpenSSL/本机库
。因此
文件位于我的
libs/
文件夹中,我的gradle以这种方式引用该文件夹:

sourceSets {
    main {
        jniLibs.srcDir(file("libs/"))
    }
}
无论如何,最终结果是my
.apk
如下所示:

 - > classes.dex
 - > lib/
     -> armeabi/
        -> libcrypto.so
        -> libssl.so
        -> libmynativelibrary.so
 - > res/ (...)
 - > resources.arsc
 - > META-INF/ (...)
 - > kotlin/ (...)
 - > AndroidManifest.xml
共享库是正确的32位ARM ELF文件。我一直在API级别24的设备上使用这个APK,并取得了巨大成功(Android 7.0+)

问题:当我切换到API level 21设备(Android 5.1-,我怀疑Android 6.0也会有同样的问题)时,程序在加载
libmynativelibrary时会立即崩溃。因此

由于
libcrypto.so
libmynativelibrary.so
的依赖项,因此程序尝试加载它。它实际上在API级别24+上运行良好,但在API级别23-上崩溃。这是因为加载的库不是我的
.apk
中的库,而是系统中的库

我的问题:我如何明确告诉Android首先在
.apk
文件中查找库,而不是在常规的系统库目录中


提前感谢。

在Nogut之前,系统库不受用户应用程序的保护。名称冲突是有问题的,它们导致谷歌为C++共享运行库创建一个单独的命名空间,这是Android NDK的一部分。 OpenSSL库也被广泛使用,超出了您的控制范围。甚至在您有机会加载自己的libssl之前,它们也可能被加载到您的进程中

因此,最好的选择是将OpenSSL构建为静态LIB,并将libmynativelibrary.so静态链接到它。这样您就拥有了一个不依赖于其他二进制文件的单片二进制文件

如果您不能遵循本课程,则应使用损坏的名称构建OpenSSL库,例如libmyssl.so和libmycrypto.so。这可能有助于避免与系统库的简单名称冲突

更好的做法是,以NDK为例,为您提供一个唯一的名称空间SSL API

不要期望从ApplicationInfo.nativeLibraryDir的解包位置显式加载库是一个健壮的解决方案:正如我之前所研究的,系统库可能会在之前加载到您的地址空间中

请注意,在使用棒棒糖之前,您必须手动加载所有非系统依赖项,并按照正确的顺序加载


<新的NDK已经下降<强> ARMeabi ,所以考虑切换到<强> ARMeabi-V7A<强>

你好,谢谢广泛的回答,现在变得更有意义了。我已经编译到armeabi-v7a,并将OpenSSL库交叉编译为静态库,现在它就像一个魅力!它也没有给apk增加那么多重量,我有点害怕它的尺寸。