【问题标题】:Android NDK linking OpenSSLAndroid NDK 链接 OpenSSL
【发布时间】:2015-11-13 04:11:48
【问题描述】:

我想在我的 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 跳过)

【问题讨论】:

  • 天啊... Android 原生构建系统很烂。 Android Studio 过去很糟糕,因为它缺乏 JNI 支持。如果可能,您可以在 OpenSSL wiki 上尝试 OpenSSL and Android。至少,您应该至少启动 OpenSSL 脚本以获取 OpenSSL 推荐的 CFLAGS,以便在 Android 的构建系统下使用。
  • 是的,谢谢你的建议 :D 不幸的是我在 Windows 上,所以我不能用 shellscript 做任何事情:((我用 msys2 试过,但没有用)
  • 可能最简单的解决方案是在 VirtualBox 中安装 Ubuntu。

标签: android c++ android-ndk openssl djinni


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多