Android NDK linking OpenSSL

Android NDK linking OpenSSL

本文关键字:OpenSSL linking NDK Android      更新时间:2023-10-16

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

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

Error:(38) undefined reference to SSL_library_init' Error:(39) undefined reference to SSL_load_error_strings'错误:(40)对OPENSSL_add_all_algorithms_noconf' Error:(42) undefined reference to CRYPTO_num_locks的未定义引用错误:(45)对CRYPTO_set_locking_callback' Error:(46) undefined reference to CRYPTO_set_id_callback的未定义引用等

我已经包含了两个文件到Android。Mk(一个到ssl,一个到crypto):

//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

编辑:我改变了我的体型。应用中的Gradle:

abiFilters += "armeabi"
abiFilters += "armeabi-v7a"
abiFilters += "x86"
abiFilters += "mips"
ldLibs += ['ssl', 'crypto']     
android.sources {
   main {
      jniLibs {
        source {
          srcDirs 'jni/libs'
        }
   }
}

它工作了,但是应用程序崩溃了(因为它在apk的错误目录中搜索库…)。我还发现,在新的实验gradle最近不支持这个"第三方共享库包括的东西"。所以我只能等了。(我也可以尝试一些与makefiles,但默认情况下他们跳过了AS)

我不相信你可以在你的应用程序中有这样的共享库,你只能用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