【发布时间】: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