2016-03-18 82 views
1

我有一個用C++ 11(線程,智能指針)編寫的庫。對於HTTP支持,該庫使用libcurl和openssl來支持HTTPS。在此之前,lib只能在Windows和iOS上工作。但我有一個任務在Android上運行。Android-21靜態構建libcurl與OpenSSL

我們的要求,是未來:

  1. NDK的Android-21平臺(貌似這個平臺,我們得到正確的C++ 11的支持上)。
  2. 的libcurl版本7.44.0
  3. OpenSSL庫(libcrypto,的libssl)版本1.0.2d

我想用這個版本庫的,因爲我們在Windows和iOS的使用它。

我設法使用Android-21平臺工具鏈爲armeabi構建這些庫。此外,我設法建立我的圖書館的來源。但是,當我聯繫一起我有這些錯誤:

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終端的方法和我決定建立OpenSSL的無UI(命令行界面)。但問題在於,libcurl需要OpenSSL UI以及這個OpenSSL版本。 OpenSSL使用用戶界面抽象來協商訪問密碼學引擎中的私鑰。

是否有可能使用最新的OpenSSL爲android構建libcurl?我應該改變我的工具鏈嗎?

回答

1

直到Android 14才完全支持方法getpwuid_r,這就是爲什麼在使用Android 21構建時您沒有看到錯誤。請參閱此commit,它實現了getpwuid_r。我認爲其他未定義的參考文獻是由於類似的問題。

1

Androdi-21與libcurl和OpenSSL完美結合,使用Android-8構建生成這些錯誤的最終庫。

+0

如果您的要求是支持Android 21,爲什麼要用Android 8構建? –

+0

以下是我的錯誤:/armeabi/libcurl.a(ui_openssl.o):function read_string_inner:error:未定義引用'bsd_signal' /usr/local/google/buildbot/src/android/ndk-r12-release/ndk/sources/cxx-stl/llvm-libC++/libcxx/include/atomic:922:錯誤:undefined對'__atomic_fetch_add_4'等的引用等 面對相同的問題。我的捲曲是用Android-9預先構建的,所以我正在用Android-21進行構建。您發佈的解決方案是否是正確的方法? – AdiAtAnd

+0

此外,我有jsoncpp和pugi用android-21構建最終.so我需要包括這些2 .a還有關於這個問題的幫助。 Android-8內置的最終庫不會對最新的Android版本有用..對吧?那它有什麼用處? – AdiAtAnd