【问题标题】:Android can't load local libcrypto unsatisfied link errorAndroid can't load local libcrypto unsatisfied link错误
【发布时间】:2012-06-15 17:11:14
【问题描述】:

我需要在我的应用程序中运行比操作系统中的更新版本的 openssl。我能够修补和 android 源代码以编译更新版本,然后提取共享库以在我的应用程序中使用。

然后,我能够编译并链接我的本机代码,该代码仅需要较新版本的 openssl 中的函数与我的新共享库(较新的 openssl 的补丁有效)。

我还能够创建一些按预期工作的 jni 函数,但只要我添加了仅在应用程序本地较新的 openssl 共享库中的函数,我就会收到不满意的链接错误。

我的假设是 libcrypto 和 libssl 的系统版本覆盖了我在 /libs/armeabi/libcrypto.so 和 /libs/armeabi/libssl.so 中的本地版本 .... 我该如何解决这个问题?

【问题讨论】:

    标签: android java-native-interface openssl shared-libraries android-ndk


    【解决方案1】:

    系统已经附带了一个名为libcrypto 的库,它将在您的库之前被选中。最简单的解决方案是给您的库一个不同的名称,并在您的 System.loadLibrary(...) 调用中使用它。

    更新

    正如您所指出的,您需要使用新名称重建库,而不仅仅是重命名文件。

    【讨论】:

    • 我尝试将 libcrypto.so 的文件名更改为其他名称,但没有成功。文件名不重要,我必须在 openssl 构建中更改它吗?
    • 没错,您需要使用这个新名称重建库。我根据您的建议更新了答案。
    【解决方案2】:

    是的,JNI 正在获取系统版本。它根本没有使用你的补丁版本。在独立 JVM 上,您会说 -Djava.library.path=/libs/armeabi 或修改环境变量 LD_LIBRARY_PATH。在 Android 上,我想您可以查找系统属性 java.library.path 并将您的库放在某个已知位置(但在系统版本所在的文件夹之前)或实际修改属性 - 前置本地版本的路径。我确实有一些使用 Android 的经验,但不是专门使用 NDK。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多