我遇到了嘗試將帶有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的教程。
任何幫助將不勝感激!
我找不到任何文件來證實這一點,但我總是看到'LOCAL_EXPORT_C_INCLUDES'指向*文件夾*的路徑,而不是單個文件。這可能是值得嘗試的'LOCAL_EXPORT_C_INCLUDES:= include/curl' – mbrenon
嗨mbrenon,我已經提出了建議的更改並更新了我的代碼,但在編譯時我仍然看到相同的兩個錯誤。 – Jake