2011-03-02 112 views
3

最近升級到NDK r5b,並且構建失敗,並且對位於靜態庫中的函數執行「未定義引用」。使用Android NDK連接靜態庫時遇到問題r5b

以下是錯誤

/home/brian/workspace/VoiceEngineDemo/obj/local/armeabi-v7a/objs-debug/voiceenginejni/voice_engine_jni.o: In function `initVE': 
/home/brian/workspace/VoiceEngineDemo/jni/voice_engine_jni.c:944: undefined reference to `VE_ADT_create' 

這似乎鏈接過程中沒有加載,即使它在Android.mk定義如下靜態模塊:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE    := voiceenginejni 

LOCAL_SRC_FILES   := voice_engine_jni.c printing.c jaudio.c etime.c 

LOCAL_CFLAGS    := -D __arm -D ANDROID -D USE_AEC_DEFAULTS -D USE_EC_DEFAULTS -D _DEBUG -D EC_VARIANT=EC_VARIANT_NEC -D AECG1_5_ENABLE 

LOCAL_STATIC_LIBRARIES  := libvoiceengine libcpufeatures libaecg2 

LOCAL_LDLIBS    := -llog -ldl  

include $(BUILD_SHARED_LIBRARY) 

$(call import-module,cpufeatures)  

的VE_ADT_create功能位於libvoiceengine.a中,該文件位於/ obj/local/armeabi-v7a /目錄中。

我會很感激,如果任何人都可以爲我闡明這一點。謝謝!

+0

http://stackoverflow.com/questions/7332679/cant-create-shared-library-with-static-inside – 2011-09-08 11:52:44

回答

1

你在使用ndk-build構建庫嗎?

如果沒有,我通常把我與JNI的文件夾中的獨立工具鏈構建的庫和LOCAL_LDLIBS直接通過名稱來引用它們:

LOCAL_LDLIBS := libvoiceengine.a 
+0

靜態庫是使用「ndk-build」腳本構建的,然後生成.a被shell腳本複製到/ obj/local/armeabi-v7a /目錄中。 – Brian 2011-03-02 21:49:40

+0

嗯,另一個缺陷是從C++訪問C函數而不使用extern「C」{...} – 2011-03-02 21:54:59

+0

我們所有的代碼都是C代碼。奇怪的是,完全相同的項目設置使用NDK 4rb沒有問題。 – Brian 2011-03-02 22:22:33