在 Android 5.x 上加载 libssl.so 时如何修复 'dlopen failed: cannot locate symbol "EVP_camellia_128_cbc"'

How to fix 'dlopen failed: cannot locate symbol "EVP_camellia_128_cbc"' when loading libssl.so on Android 5.x

我尝试构建 64 位 (arm64) Openssl v1.1.1b 并将其作为共享库添加到我的应用程序(libcrypto.so 和 libssl.so)。 我使用 --arch arm64 和 --api 21 个参数构建了独立的工具链,然后我用它构建了 openssl 库并将它们添加到我的应用程序中。 Android 6.x 及更高版本的所有 64 位设备都运行良好,但我被困在 Android 5.0.1 64 位 – Lenovo TAB 2 A10-70L 平板电脑上。

问题是,在这个特定的 Android 上,当我加载 libssl.so 时,出现错误:

E/art     ( 2755): dlopen("/data/app/com.myapp.mypackage-1/lib/arm64/libssl.so", RTLD_LAZY) failed: 
dlopen failed: cannot locate symbol "EVP_camellia_128_cbc" referenced by "/data/app/com.myapp.mypackage-1/lib/arm64/libssl.so"...

E/MY_APP( 2755): 2019-06-12 14:22:27,984: [MY_APP][18446744071776944368] ERROR (2117) - Error in loading libraries : 
dlopen failed: cannot locate symbol "EVP_camellia_128_cbc" referenced by "/data/app/com.myapp.mypackage-1/lib/arm64/libssl.so"...

因此将抛出异常 -> 在 libssl.so 之后加载其他库将不会执行,并且应用程序在闪屏期间或之后崩溃。

我在 Whosebug 上发现,如果你针对更高的 android 版本编译本机库(如 openssl),那么使用的平板电脑是......但我用 api 制作了 openssl 21,就是Android5.0,应该没有问题。看起来,openssl 需要设备库中的这个符号,而这个设备没有。

我尝试了什么:

  1. 要使用不同的 NDK 来构建 openssl -> 我使用了 15-19 的 NDK, 使用此版本我构建了一个应用程序,但发生了同样的错误(与 “找不到符号”)。我尝试了 12-14 个 NDK 来接近我们的 NDK 在我们的应用程序中使用其他原生库(即 12b),但是 这个 NDK 我根本无法制作 openssl 库,它会失败 在构建过程中。
  2. 使用不同的 NDK 构建整个应用程序 -> 我 尝试了 16 和 19,但是构建失败了,我没有 想想,会有帮助。
  3. 使用21作为minsdk版本 Android清单、项目属性和 build.gradle 文件 一切都在同一个 api 版本中,但没有成功。
  4. 我尝试构建并实施更高版本的 openssl – 1.1.1c – 但是 与 Camellia 发生相同的错误。
  5. 我试图补充缺失的 符号作为 evp.h 的宏,但没有成功(也许我应该添加 它以不同的方式)。
  6. 我试图从中排除山茶花密码 通过编辑 makefile 构建 openssl,但整个构建以 错误

为什么会发生这种情况,我如何将它修复到 运行 我在 Android 5.x 64 位上的应用?

自行解决:) 毕竟我如上所述尝试过,我找到了唯一有效的解决方案 - build openssl as static library(所以 libssl.a 和 libcrypto.a)并将这些文件添加到应用程序。

看来,动态 openssl 库 (*.so) 不适用于我的应用程序,它使用较旧的 NDK,但老实说,我仍然不知道为什么。