使用Android NDK r5b连接静态库出现问题

3

最近升级到 NDK r5b,但是编译失败了,并提示“undefined reference”错误,这些函数位于一个静态库中。

以下是错误信息:

/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/目录中。

如果有人能为我解答这个问题,我将不胜感激。谢谢!


http://stackoverflow.com/questions/7332679/cant-create-shared-library-with-static-inside - Viktor Apoyan
1个回答

1
你是使用ndk-build来构建库吗?
如果不是,我通常会将使用独立工具链构建的库保存在jni文件夹中,并直接通过名称在LOCAL_LDLIBS中引用它们:
LOCAL_LDLIBS := libvoiceengine.a

静态库是使用“ndk-build”脚本构建的,然后由一个shell脚本将生成的.a文件复制到/obj/local/armeabi-v7a/目录中。 - Brian
哦,又一个陷阱是在C++中访问C函数时没有使用extern "C" { ... }。 - Matthew
我们所有的代码都是C代码。奇怪的是,使用NDK 4rb构建的完全相同的项目设置没有任何问题。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接