如何修复'dlopen失败:在Android 5.x上加载libssl.so时找不到符号“ EVP_camellia_128_cbc”'

时间:2019-06-12 15:18:42

标签: 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版本编译本机库(如openssl),则使用的平板电脑是……但是我使用api 21制作openssl,那就是Android 5.0,因此应该不这样做。没问题。看来,openssl希望该符号出现在设备的库中,而该设备没有它。

我尝试过的事情:

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

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

1 个答案:

答案 0 :(得分:1)

自我解决方案:) 经过如上所述的尝试,我找到了唯一可行的解​​决方案-将openssl构建为静态库(因此libssl.a和libcrypto.a)并将此文件添加到应用中。

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