1

我遇到了嘗試將帶有SSL支持的cURL編譯到應用程序時遇到的問題。使用Android NDK將共享庫和靜態庫編譯到共享庫中

到目前爲止,我已經成功地將openSSL包編譯爲libcrypt.so和libssl.so。

我相信我已經成功編譯了一個libcurl.a版本的SSL支持,使用配置腳本並通過NDK中的交叉鏈編譯器(在linux環境下)運行它。

現在,我正在嘗試在Eclipse下編寫一個.so庫,該庫可以由Android應用程序的Java代碼調用。

這是迄今爲止的文件結構:

Project Folder ---> jni ---> include ---> curl ---> curl headers 
         |   | 
         |    -> openssl ---> ssl and crypto headers 
         | 
          -> libcrypto.so 
          -> libssl.so 
          -> libcurl.a 
          -> jniProcessRequest.c 
          -> Android.mk 

Android.mk寫着:

LOCAL_PATH := $(call my-dir) 
MY_PATH := $(LOCAL_PATH) 
include $(CLEAR_VARS) 
LOCAL_PATH := $(MY_PATH) 

LOCAL_MODULE := crypto 
LOCAL_SRC_FILES := libcrypto.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/openssl/ 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := ssl 
LOCAL_SRC_FILES := libssl.so 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/openssl/ 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := curl 
LOCAL_SRC_FILES := libcurl.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/curl/ 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := JNIProcessRequest 
LOCAL_SRC_FILES := JNIProcessRequest.c 
LOCAL_SHARED_LIBRARIES := crypto ssl 
LOCAL_STATIC_LIBRARIES := curl 
LOCAL_LDLIBS := -llog 

include $(BUILD_SHARED_LIBRARY) 

jniProcessRequest.c:

#include <jni.h> 
#include <stdlib.h> 
#include "include/curl/curl.h" 
#include <android/log.h> 

JNIEXPORT void JNICALL Java_com_example_jniprocessrequest_MainActivity_jniProcessRequest(JNIEnv * env, jobject obje){ 
CURL *conn; 
conn = curl_easy_init(); 
} 

每次我試圖編譯上面,我在Eclipse中有未定義的參考錯誤:

make: *** [obj/local/armeabi/libJNIProcessRequest.so] Error 1 
undefined reference to 'curl_easy_init' 

我在想這是某種連鎖錯誤,但我正在努力尋找錯誤發生的地方。我花了將近兩天的時間嘗試將共享庫放置在不同位置的所有不同方法,使用共享libcurl切換靜態libcurl,更改Android.mk文件以及遵循關於如何在Android中使用cURL的教程。

任何幫助將不勝感激!

+0

我找不到任何文件來證實這一點,但我總是看到'LOCAL_EXPORT_C_INCLUDES'指向*文件夾*的路徑,而不是單個文件。這可能是值得嘗試的'LOCAL_EXPORT_C_INCLUDES:= include/curl' – mbrenon

+0

嗨mbrenon,我已經提出了建議的更改並更新了我的代碼,但在編譯時我仍然看到相同的兩個錯誤。 – Jake

回答

2

我認爲這個問題是由於一個錯誤構建的libcurl.a靜態庫引起的。我用一個由GitHub上的用戶編譯的庫替換了我的庫,並且不更改任何代碼,鏈接錯誤消失。

+0

Hi @Jake,你介意共享包含libcurl和所有其他庫的項目文件夾(無需你的應用程序源代碼)以支持使用android應用程序進行卷曲嗎?基本上只是jni文件夾會工作...因爲我有麻煩在我的環境下編譯libcurl – Thiago

+1

Hi @Thiago,我目前沒有訪問項目文件夾,但我相信我使用的libcurl.so庫來自[link ](https://github.com/liudongmiao/curl-android)或[鏈接](https://github.com/fuhu/curl-android)。 – Jake

+0

嗨@Jake,謝謝你回到我身邊。我將查看您共享的鏈接,因爲我正在使用的libcurl.a可能沒有ssl支持,因爲它不斷返回我不支持的協議錯誤。 – Thiago

0

您使用curl作爲預建模塊。

如前所述由NDK文檔,你應該小心把它包起來include $(CLEAR_VARS)和(最重要的)下include $(PREBUILT_STATIC_LIBRARY)指令如下:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := foo-prebuilt 
LOCAL_SRC_FILES := libfoo.a 
include $(PREBUILT_STATIC_LIBRARY) 

右收後照顧include $(CLEAR_VARS)include $(BUILD_SHARED_LIBRARY)來包裝你JNIProcessRequest模塊。

有關更多詳細信息,請參閱docs/PREBUILTS.html部分,您可以在Android NDK文件夾(它看起來像this)中找到該部分。

+0

嗨deltheil,我已經實施了您推薦的更改,並在原始帖子中更新了我的代碼以反映新的更改。我還閱讀了您推薦的文檔。現在我的錯誤似乎已經改變爲某種形式的鏈接錯誤,任何想法? – Jake