【问题标题】:Trouble linking static libraries using Android NDK r5b [duplicate]使用 Android NDK r5b 链接静态库时遇到问题 [重复]
【发布时间】:2011-03-02 21:27:14
【问题描述】:

最近升级到 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/ 目录下。

如果有人可以为我阐明这一点,我将不胜感激。谢谢!

【问题讨论】:

标签: android linker static-libraries android-ndk


【解决方案1】:

您是否正在使用 ndk-build 构建库?

如果没有,我通常将使用独立工具链构建的库保存在 jni 文件夹中,并在 LOCAL_LDLIBS 中直接按名称引用它们:

LOCAL_LDLIBS := libvoiceengine.a

【讨论】:

  • 静态库是使用“ndk-build”脚本构建的,然后生成的 .a 通过 shell 脚本复制到 /obj/local/armeabi-v7a/ 目录中。
  • 嗯,另一个陷阱是从 C++ 访问 C 函数而不使用 extern "C" { ... }
  • 我们所有的代码都是C代码。奇怪的是,使用 NDK 4rb 构建完全相同的项目设置没有问题。
猜你喜欢
  • 2021-04-25
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2011-09-01
  • 2017-03-14
  • 1970-01-01
  • 2011-06-13
  • 2015-01-24
相关资源
最近更新 更多