Android-21 使用 OpenSSL 静态构建 libcurl

Android-21 static build of libcurl with OpenSSL

我有一个用 C++11 编写的库(线程、智能指针)。对于 HTTP 支持,该库使用 libcurl 和 openssl 来支持 HTTPS。在此之前,这个库只能在 Windows 和 iOS 上工作。但是我在 Android.

上接到了 运行 的任务

我们的要求是:

  1. NDK Android-21 平台(看起来在这个平台上我们得到了正确的 C++11 支持)。
  2. libcurl 版本 7.44.0
  3. OpenSSL 库(libcrypto、libssl)版本 1.0.2d

我想使用这个版本的库,因为我们在 Windows 和 iOS.

使用它

我设法使用 Android-21 平台工具链为 armeabi 构建了这些库。我还设法建立了我的图书馆的来源。但是当我 link 在一起时,我得到了这些错误:

third_party/android/prebuilt/arm\libcurl.a(libcurl_la-curl_ntlm_wb.o): In function `ntlm_wb_init':
curl_ntlm_wb.c:(.text+0x194): undefined reference to `getpwuid_r'
curl_ntlm_wb.c:(.text+0x314): undefined reference to `getpwuid_r'
jni/../../../stsw_third_party/android/prebuilt/arm\libcrypto.a(ui_openssl.o): In function `read_string_inner':
ui_openssl.c:(.text+0x16c): undefined reference to `signal'
ui_openssl.c:(.text+0x294): undefined reference to `tcsetattr'
ui_openssl.c:(.text+0x330): undefined reference to `tcsetattr'
jni/../../../stsw_third_party/android/prebuilt/arm\libcrypto.a(ui_openssl.o): In function `open_console':
ui_openssl.c:(.text+0x5fc): undefined reference to `tcgetattr'

我认为 Android 在自己的 API 中没有终端方法,我决定构建没有 UI(命令行界面)的 OpenSSL。但问题是 libcurl 需要使用此 OpenSSL 版本的 OpenSSL UI。 OpenSSL 使用用户界面抽象来协商对加密引擎中私钥的访问。

是否可以使用最新的 OpenSSL 为 android 构建 libcurl?我应该更改我的工具链吗?

Androdi-21 与 libcurl 和 OpenSSL 完美配合,使用 Android-8 构建产生这些错误的最终库。

方法 getpwuid_r 直到 Android 14 才得到完全支持,这就是为什么您在使用 Android 21 构建时看不到错误的原因。请参阅此 commit 实现了 getpwuid_r。我认为其他未定义的引用是由于类似的问题。