2

我想在我的 android ndk 项目中使用 openssl。

但是当我构建它时,我得到了这些错误:

错误:(38) 对SSL_library_init' Error:(39) undefined reference toSSL_load_error_strings 的未定义引用错误:(40) 对OPENSSL_add_all_algorithms_noconf' Error:(42) undefined reference toCRYPTO_num_locks 的未定义引用错误:(45) 对CRYPTO_set_locking_callback' Error:(46) undefined reference toCRYPTO_set_id_callback 的未定义引用等。

我在 Android.mk 中包含了两个文件(一个用于 ssl,一个用于加密):

//libcrypto.mk
include $(CLEAR_VARS)

LOCAL_MODULE    := ssl-crypto
LOCAL_SRC_FILES := ../libs/system/$(TARGET_ARCH_ABI)/libcrypto.so

include $(PREBUILT_SHARED_LIBRARY)
//libssl.mk
include $(CLEAR_VARS)

LOCAL_MODULE    := ssl-ssl
LOCAL_SRC_FILES := ../libs/system/$(TARGET_ARCH_ABI)/libssl.so

include $(PREBUILT_SHARED_LIBRARY)

我已将此添加到 app/build.gradle:

    stl = "gnustl_static"

    cppFlags  += "-I${file("../../../../support-lib/jni")}".toString()
    cppFlags  += "-I${file("../../../generated-src/cpp")}".toString()
    cppFlags  += "-I${file("../../../taps-api")}".toString()
    cppFlags  += "-I${file("../../../include")}".toString()

    cppFlags  += "-std=c++11"
    cppFlags  += "-DASIO_STANDALONE"

    cppFlags  += "-lssl"
    cppFlags  += "-lcrypto"

我正在使用 C++ 中的 openssl,并使用 dropbox/djinni 生成 jni 包装器。我也在使用 Android Studio 1.3 stable 和 gradle 2.5

编辑:我在应用程序中更改了我的 build.gradle:

abiFilters += "armeabi"
abiFilters += "armeabi-v7a"
abiFilters += "x86"
abiFilters += "mips"
ldLibs += ['ssl', 'crypto']     

android.sources {
   main {
      jniLibs {
        source {
          srcDirs 'jni/libs'
        }
   }
}

它起作用了,但是应用程序崩溃了(因为它在 apk 的错误目录中搜索库...)。我还发现,最近在新的实验 gradle 中不支持这个“包括东西的第三方共享库”。所以我将不得不等待它。(我也可以尝试使用makefile,但默认它们被AS跳过)

4

1 回答 1

1

我不相信您可以在您的应用程序中拥有这样的共享库,您只能使用 System.loadLibrary() 从 Java 加载 so 对象

您需要将 OpenSSL 静态编译到您的 C++ 代码的其余部分(如链接 .a 加密和 SSL 库中)

这是一个例子

https://github.com/gcesarmza/curl-android-ios/blob/master/test-android-project/app/src/main/jni/Android.mk

curl Android iOS 项目就是这样做的,值得一看https://github.com/gcesarmza/curl-android-ios

于 2018-06-19T09:09:06.673 回答