2013-07-30 101 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)。解决这个问题,解决了这个问题。