【问题标题】:java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libcrypto.so.1.0.0" needed by "libPrivateSsl.so";java.lang.UnsatisfiedLinkError:dlopen 失败:无法加载“libPrivateSsl.so”所需的库“libcrypto.so.1.0.0”;
【发布时间】:2018-01-30 06:22:36
【问题描述】:

我在我的项目中使用预构建的 openssl。加载后应用程序崩溃并出现此错误

java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libcrypto.so.1.0.0" needed by "libPrivateSsl.so"; caused by library "libcrypto.so.1.0.0" not found

我的 android.mk 看起来像这样

LOCAL_PATH := $(call my-dir)

# Prebuilt libssl
include $(CLEAR_VARS)
LOCAL_MODULE := ssl
LOCAL_SRC_FILES := precompiled/libPrivateSsl.so
include $(PREBUILT_SHARED_LIBRARY)

# Prebuilt libcrypto
include $(CLEAR_VARS)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := precompiled/libPrivateCrypto.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := myLibrary
TARGET_PLATFORM := android-3
LOCAL_SRC_FILES := native-lib.cpp
LOCAL_C_INCLUDES = $(LOCAL_PATH)/include
LOCAL_LDLIBS := -llog
LOCAL_SHARED_LIBRARIES := ssl crypto


include $(BUILD_SHARED_LIBRARY)

在这样的活动中加载库

static {
    System.loadLibrary("PrivateSsl");
    System.loadLibrary("PrivateCrypto");
    System.loadLibrary("myLibrary");

}

我正在使用 Kit-kat 进行 Ubuntu 系统测试。 请帮我解决这个错误。

【问题讨论】:

  • 也许将包含 libcrypto.so.1.0.0 的目录添加到您的 LD_LIBRARY_PATH 环境变量中。
  • @john 我没有 libcrypto.so.1.0.0 我有 libcrypto.so ..但是为什么以及如何设置 LD_LIBRARY_PATH?
  • 如果你没有 libcrypto.so.1.0.0 那么我会说这是你的问题。但我无法确切地说出你想要做什么。我也不了解为 android 构建的所有细节。
  • 您可能需要描述为达到这一点所采取的所有步骤。也许你在这个过程的早期犯了一些错误。
  • @john 我从 git 下载了预构建的 openssl。在那里我得到了 libcrypto.so、libssl.so 和包含一些 c 文件的包含文件夹。我直接在我的项目中使用这些文件。正如 Alex cohn sir 所建议的那样

标签: android c++ android-ndk openssl java-native-interface


【解决方案1】:

您下载了一些错误的适用于 Android 的 OpenSSL 版本,该版本未正确构建(类似于 this one.Android does not support versioning in SONAMEs

您可以找到更好的 OpenSSL 预构建版本,但不建议这样做。为了让这些库负责您的秘密通信,您最好确保您自己从受信任的 (official) 来源构建它,并且它不会将您的私人信息泄露给某些流氓第三方。

作为最低限度的修复,您可以try to use patchelf 实用程序来修复库中的 SONAME。

【讨论】:

  • 不相信你的加密对你在网上找到的一些任意的openssl预建,这个说法不够强烈。
【解决方案2】:

我通过对 android.mk 文件进行一些小改动解决了这个问题

我删除了 .so 文件并放置了 .a 文件。

我的 android.mk 现在看起来像这样

  LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ssl_static
LOCAL_SRC_FILES := precompiled/libssl.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := crypto_static
LOCAL_SRC_FILES :=precompiled/libcrypto.a
include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := myLibrary

LOCAL_SRC_FILES := native-lib.cpp
LOCAL_C_INCLUDES = $(LOCAL_PATH)/include
LOCAL_LDLIBS := -llog
LOCAL_STATIC_LIBRARIES := ssl_static crypto_static
include $(BUILD_SHARED_LIBRARY)

got this idea from here

link

【讨论】:

  • 静态库绝对比共享库更安全,但使用不受信任的第三方预构建的库仍然会使您的应用面临风险。
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2017-04-11
  • 2019-07-31
  • 2016-01-11
  • 2020-07-28
  • 1970-01-01
相关资源
最近更新 更多