首页 > 解决方案 > opendl 在 android 的 alljoynlib 中失败

问题描述

我的项目中有一个alljoyn库,可以为投票应用程序配对 android 设备。在旧设备中,该应用程序运行正常,但在新设备中,它在开始运行时停止。

这是错误,我得到:

Caused by: java.lang.UnsatisfiedLinkError: dlopen failed: library "libcrypto.so" not found
                      at java.lang.Runtime.loadLibrary0(Runtime.java:1016)
                      at java.lang.System.loadLibrary(System.java:1657)
                      at com.example.nima.voting.alljoyn.peergroupmanager.PeerGroupManager.<clinit>(PeerGroupManager.java:60)

标签: androiddlopenalljoyn

解决方案


注意:我不是 Android 开发人员。

也就是说,我发现了这个 StackOverflow question,其中提到了与您描述的类似的行为:

主 Android 进程是zygote. 就像init在 Linux 中一样。Zygote 在启动时会加载 OpenSSL,它会加载 0.9.8 版本。如果您链接到 OpenSSL 1.0.1,那么您将遇到神秘的运行时崩溃。崩溃是由于 Android 加载程序使用了 0.9.8 版本的库(已经从 Zygote 映射),而不是您的 OpenSSL 版本。

可以使用共享对象,但您的共享对象必须是静态版本libssland的包装器libcrypto

您提到该应用程序在旧设备中正常加载,但在新设备中崩溃。如果新设备链接到 OpenSSL v1.0.1 而旧设备链接到 v0.9.8,那么这可能是问题的根本原因。

解决方案似乎是针对静态库进行编译libcryptolibssl显然也是如此),或者在构建后重命名这些依赖项,然后将它们复制到您的precompiled目录中(如果我正确解释了链接中的答案):

原因是系统自带这些共享库的自己的(可能不同的)版本,加载器将使用 /system/lib/libssl.soand/system/lib/libcrypto.so而不是您的私有副本。


推荐阅读