2012-11-13 42 views
1

我會盡快公開我的問題。我試圖在Android上移植curl並在我的應用中使用它。我用ARM工具鏈構建了捲曲庫,並進行了配置和製作(幾次以確保我第一次沒有做錯任何事情)。「對檔案中的」(函數)&「的未定義引用不是對象」Android ndk-build

我然後繼續把新創建的libcurl.a和我curljni.c到我的JNI的文件夾,只要下面的Android.mk:

LOCAL_PATH:= $(call my-dir) 

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

include $(CLEAR_VARS) 
LOCAL_MODULE := curljni 
LOCAL_SRC_FILES := curljni.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include/curl 
LOCAL_STATIC_LIBRARIES := libcurl 
include $(BUILD_SHARED_LIBRARY) 

我已經嘗試了很多東西我敢肯定它現在看起來不錯,但每當我試圖建立一個與NDK的構建工具,我得到如下:

enter image description here

注:curljni.c使得函數調用libcurl庫中和它的easy.h和curl.h文件。然後它們被包含在文件的頂部。

我也試着問整個庫獲取加載到我的Android應用程序,使用LOCAL_WHOLE_STATIC_LIBRARIES代替LOCAL_STATIC_LIBRARIES,但沒有更多的成功:

enter image description here

以前:

  • 下載curl.7.28.0
  • 爲ARM 4.6製作了獨立工具鏈
  • 修復了curl中的幾個文件,它們的linebreaks是DOS的,並且需要Unix(配置中的bug) - 其中一個是depcomp,鏈接到libcurl_la-file.lo
  • ./configure --host = arm-linux- androidaebi - -with-的zlib --enable-IPv6的
  • 化妝/ make install的
  • 增加從產生libcurl.a捲曲\ lib.libs
+0

我用了一個下載的.a文件,它工作。但是,我不知道我自己的.a版本有什麼錯誤。 – PeterGriffin

+1

「存檔中的成員......不是對象」,未定義的引用(即未找到符號)的問題聽起來像一個架構問題,即仔細檢查你構建libcurl的方式,以便靜態庫包含'armeabi'目標文件。特別要確保它使用Android工具鏈中的編譯器(請參見幻燈片34,35和36:https://speakerdeck.com/deltheil/running-native-code-on-android-number-osdcfr-2012)。 – deltheil

+0

當我使用交叉工具鏈(尚未使用SYSROOT和BUILD)時,我沒有指定CC和CXX,當我有時間的時候我會放棄它。感謝您的鏈接。 – PeterGriffin

回答

0

好吧, 你的問題是,你的庫libcurl.a是未搭配Android ndk gcc .. 已完成:

$ ./configure --host=arm-linux-androidaebi --with-zlib --enable-ipv6 
$ make 
$ make install 

這將生成一個庫使用您的PC gcc ..不好。


我要做的就是配置開源庫l對於Android的使用命令行的(或像你這樣做):

./configure --build=x86_64-unknown-linux-gnu --host=arm-linux-androideabi --target=arm-linux-androideabi 

但你schould不叫make和make install! 。

你必須創建一個android.mk whinch將編譯你的libcurl所有源文件+您的JNI文件「curljni.c」,並把所有在一個lib目錄下:這裏Android.mk的編譯SQLITE3

################################################### 
# SQLITE3 
################################################### 
include $(CLEAR_VARS) 
LOCAL_MODULE := Mysqlite3 
MY_LOCAL_SQLITE_SRC := $(LOCAL_PATH)/sqlite/ 

LOCAL_CPPFLAGS := -g 
LOCAL_CPPFLAGS += -I $(MY_LOCAL_SQLITE_SRC) 


LOCAL_EXPORT_C_INCLUDES:=$(MY_LOCAL_SQLITE_SRC) 

FILE_LIST :=$(wildcard $(MY_LOCAL_SQLITE_SRC)*.c*) 
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%) 

# My SQLITE3 JNI FILE 
LOCAL_SRC_FILES +=mysqlite_jni.cpp 

# include native NDK library liblog and libz 
LOCAL_LDLIBS := -llog -lz 
include $(BUILD_SHARED_LIBRARY) 
爲例
+0

好的,我會嘗試指定正確的GCC! – PeterGriffin

相關問題