2012-07-27 110 views
1

我已經創建了一個android應用程序,這裏大部分代碼都在c中,所以我使用jni創建了它。我必須創建socket.so文件,其中我必須使用libtest.so避免使用.a創建.so

同時在socket.so中使用libtest.so所以我得到了error:undefined reference to function()。我的函數()存在於libtest.so內。

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := libtest 
LOCAL_SRC_FILES := libtest.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := socket 
LOCAL_SHARED_LIBRARIES += libtest 
LOCAL_SRC_FILES := source/interface.c source/file.c 
LOCAL_LDFLAGS += libtest.a 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../libtest/jni/include 
include $(BUILD_SHARED_LIBRARY) 

,但它同時需要libtest.so & libtest.a文件存在:通過這麼建議,我已經建立了我Android.mk如下使用Avid這一點。如果我只使用libtest.a就好了。

因爲我的要求是創建libtest.so並將其包含在socket.so中,任何人都可以告訴我如何避免依賴.a文件來創建.so文件。

如果我會評論LOCAL_LDFLAGS += libtest.a然後我得到了error:undefined reference to function()

任何一個plz幫助我走出這個問題.......

回答

1

似乎有點不乾淨。

共享庫(.so)和檔案(.a)都應該包含相同的代碼,但實際上它們可能不會。你應該做的第一件事是檢查.so是否真的有所有的符號。鏈接器可能已經優化了一些。爲此,請使用nm實用程序或objdump

你也可以發佈命令ndk-build正在執行的控制檯轉儲?

你也可能試着避免你正在做的事情,因爲NDK並不是真的意味着要產生相互依賴的共享庫。這當然是可能的,但推薦的方法是將你的庫放入靜態歸檔並將它們直接鏈接到生成的JNI .so中。

編輯:

LOCAL_SRC_FILES := libtest.so似乎是錯誤的。如果你想鏈接與共享庫,該庫傳給連接器不是編譯器:LOCAL_LDFLAGS += libtest.so,或者甚至更好,LOCAL_LDFLAGS += -L. -ltest

+0

while nm -a libxml2.so我沒有得到任何符號。 但是當我完成nm -a libxml2.a時,我得到了它們...... .. – 2012-07-27 11:22:44

+0

使用'nm -D'作爲共享庫,否則您將看不到任何東西。不要使用'-a'作爲靜態庫,它將打印調試符號而不是普通的符號。 – onitake 2012-07-27 11:32:05

+0

是通過使用-D我能夠得到東西 – 2012-07-27 11:53:24

0

非常感謝給@onitake。

這裏存在一個簡單的錯誤,那就是libtest.so不合適(由具有錯誤的代碼創建)。

然後當我創建了一個合適的libtest.so,

注:

如果有一個人是有正確的.so文件,仍然提示錯誤則可能是一些鏈接錯誤。所以JST刪除行:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../libtest/jni/include 

,並把

LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH)/../../libtest/jni/include 

兩個以上陳述的是相同的,但有些時候,它的工作。