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

标签 android openssl android-5.0-lollipop dlopen

我尝试构建 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 之后加载其他库将不会执行,并且应用程序会在闪屏期间或之后崩溃。

我在 StackOverflow 上发现,如果你针对更高的 Android 版本编译 native 库(如 openssl),则可能会导致使用的平板电脑......但我使用 api 21 制作 openssl,即 Android 5.0,所以应该有'没问题。看起来,openssl 期望设备的库中有这个符号,而该设备没有它。

我尝试过的:

  1. 使用不同的 NDK 来构建 openssl -> 我使用了 15-19 个 NDK, 使用这个版本我构建了一个应用程序,但发生了同样的错误(与 “无法找到符号”)。我尝试了 12-14 NDK 来接近我们的 NDK 在我们的应用程序中用于其他 native 库(即 12b),但使用 这个 NDK 我根本无法制作 openssl 库,它会失败 在构建期间。
  2. 使用不同的 NDK 来构建整个应用程序 -> I 尝试了 16 和 19,但是构建失败了,我不知道 想想,这会有帮助。
  3. 使用 21 作为 minsdkversion AndroidManifests、project-properties 和 build.gradle 文件 一切都在同一个 api 版本中,但没有成功。
  4. 我尝试构建并实现更高版本的 openssl – 1.1.1c – 但是 Camellia 也出现同样的错误。
  5. 我尝试添加缺失的内容 符号作为 evp.h 的宏,但没有成功(也许我应该添加 以不同的方式)。
  6. 我试图将山茶花密码排除在外 通过编辑 makefile 构建 openssl,但整个构建以 错误

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

最佳答案

自行解决:) 毕竟我按照上面提到的尝试,找到了唯一有效的解决方案 - 将 openssl 构建为静态库(因此 libssl.a 和 libcrypto.a)并将此文件添加到应用程序中。

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

关于android - 在 Android 5.x 上加载 libssl.so 时如何修复 'dlopen failed: cannot locate symbol "EVP_camellia_128_cbc"',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56565552/

相关文章:

c++ - 如何使用 C++ 中的 openssl 库验证自签名证书?

android - 如何在 Android 工具栏操作栏中为 Spinner 设置正确的文本大小

android - 致命异常 : main 03-26 > 13:09:15. 145 : E/AndroidRuntime(389): java. lang.RuntimeException: > 无法启动 Activity

java - 每 2 秒刷新一次从 JSON 响应填充的 listView

android - Phonegap,发布版本中的 Android getJSON 调用

web-services - 在 Delphi Web 服务中使用 OpenSSL - 可用协议(protocol)和密码

java - android - 将 ToggleButton 转换为子类

python - 如何获取多个域的数据框中格式化的 ssl 信息?

android - RecyclerView + CardView + 触控反馈

android - MediaStyle 通知未响应 RemoteControl 事件。