2013-07-30 38 views
0

這是我的完整Android.mk文件,當我嘗試建立這個,我得到一個鏈接器問題(詳見下)的Android NDK連接C模塊與C++應用程序

LOCAL_PATH := $(call my-dir) 

# 
# Opus - low-latency audio codec 
# 

include $(CLEAR_VARS) 
LOCAL_DIR := opus-1.0.3 
LOCAL_MODULE := opus 

LOCAL_CELT_SOURCES := \ 
    $(LOCAL_DIR)/celt/bands.c \ 
    ... 

LOCAL_SILK_SOURCES := \ 
    $(LOCAL_DIR)/silk/CNG.c \ 
    ... 

LOCAL_SILK_SOURCES_FIXED := \ 
    $(LOCAL_DIR)/silk/fixed/LTP_analysis_filter_FIX.c \ 
    ... 

LOCAL_SILK_SOURCES_FLOAT := \ 
    $(LOCAL_DIR)/silk/float/apply_sine_window_FLP.c \ 
    ... 

LOCAL_OPUS_SOURCES := \ 
    $(LOCAL_DIR)/src/opus.c \ 
    ... 

LOCAL_CFLAGS := -DNONTHREADSAFE_PSEUDOSTACK 

LOCAL_C_INCLUDES := \ 
    $(LOCAL_DIR)/include \ 
    $(LOCAL_DIR)/celt \ 
    $(LOCAL_DIR)/silk \ 
    $(LOCAL_DIR)/silk/fixed \ 
    $(LOCAL_DIR)/silk/float 

LOCAL_SRC_FILES := $(LOCAL_CELT_SOURCES) \ 
    $(LOCAL_SILK_SOURCES) \ 
    $(LOCAL_SILK_SOURCES_FIXED) \ 
    $(LOCAL_SILK_SOURCES_FLOAT) 

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_DIR)/include 

include $(BUILD_STATIC_LIBRARY) 

################ 

include $(CLEAR_VARS) 

LOCAL_MODULE := audio-client-jni 

LOCAL_SRC_FILES := audio-client-jni.cpp 

# low latency codec 
LOCAL_STATIC_LIBRARIES += opus 

# for native audio 
LOCAL_LDLIBS += -lOpenSLES 

# for logging 
LOCAL_LDLIBS += -llog 

# for native asset manager 
LOCAL_LDLIBS += -landroid 

include $(BUILD_SHARED_LIBRARY) 

爲了排除有一個opus正在構建的方式問題我已經完成了使用稱爲tundra的不同構建系統的完全相同的事情,並且它使用MSVC++在Windows上編譯得很好。

這裏的鏈接器命令和錯誤(我已經格式化的命令行的可讀性)

C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ 
    -Wl,-soname,libaudio-client-jni.so 
    -shared 
    --sysroot=C:/Projects/android-ndk-r8e/platforms/android-14/arch-arm 
    C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o 
    C:/Projects/workspace/AudioClient//obj/local/armeabi/libopus.a 
    C:/Projects/workspace/AudioClient//obj/local/armeabi/libstdc++.a 
    -lgcc 
    -no-canonical-prefixes 
    -Wl,--no-undefined 
    -Wl,-z,noexecstack 
    -Wl,-z,relro 
    -Wl,-z,now 
    -LC:/Projects/android-ndk-r8e/platforms/android-14/arch-arm/usr/lib 
    -lOpenSLES 
    -llog 
    -landroid 
    -lstdc++ 
    -lc 
    -lm 
    -o C:/Projects/workspace/AudioClient//obj/local/armeabi/libaudio-client-jni.so 

錯誤遵循

C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o: in function (anonymous namespace)::AuClient::ReceiveThenEnqueue():C:/Projects/workspace/AudioClient//jni/audio-client-jni.cpp:419: error: undefined reference to 'opus_decode' 
C:/Projects/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/Projects/workspace/AudioClient//obj/local/armeabi/objs/audio-client-jni/audio-client-jni.o: in function InitializeThread:C:/Projects/workspace/AudioClient//jni/audio-client-jni.cpp:387: error: undefined reference to 'opus_decoder_create' 

我需要第二次對這個眼睛,它的definetly鏈接audio-client-jni.olibopus.a之前,但如果這是問題,我不明白如何修改生成文件來獲取desiered結果。當包含在C++應用程序中時,opus.h API使用extern「C」定義。到目前爲止沒有運氣。

+0

很可能,libopus.a會遺漏一些對象。試試'nm'來檢查它輸出的內容。 –

+0

@AlexCohn如何運行nm?我目前在Windows上,並且無法獲得可以運行NDK命令的命令提示符。 –

+0

@AlexCohn在'nm'和yor右邊解決了這個問題,我似乎無法在lib問題中找到opus_decode或opus_decoder_create,現在爲什麼? –

回答

0

感謝@AlexCohn的幫助,顯然沒有任何錯誤,而是所有的源文件都沒有正確包含在內,略有忽視。

"C:\Projects\android-ndk-r8e\toolchains\arm-linux-androideabi-4.6\prebuilt\windows-x86_64\bin\arm-linux-androideabi-nm.exe" "C:\Projects\workspace\AudioClient\obj\local\armeabi\libopus.a" 

我只是拿起什麼似乎是合理的:

在我的情況,我不知道我應該如何設置的東西,才能夠運行的bin UTIL命令,幸運的是,因爲它的簡單預編譯的工具鏈。

nm的輸出我可以驗證出口不在那裏。仔細檢查後,我發現我忘記了在我的LOCAL_C_INCLUDES中包含$(LOCAL_OPUS_SOURCES)。解決這個問題,解決了這個問題。