我试图构建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希望该符号出现在设备的库中,而该设备没有它。
我尝试过的事情:
为什么会发生这种情况,以及如何修复它以便在Android 5.x 64位上运行我的应用?
答案 0 :(得分:1)
自我解决方案:) 经过如上所述的尝试,我找到了唯一可行的解决方案-将openssl构建为静态库(因此libssl.a和libcrypto.a)并将此文件添加到应用中。
动态的opensl库(* .so)似乎不适用于我的使用旧版NDK的应用程序,但是老实说,我仍然不知道为什么。