[英]Android NDK error: undefined reference
曾经有一些类似于我的问题,但是似乎他们的解决方案对我不起作用。
我正在尝试使用Android NDK编译dumpsys
源代码。 我在Android.mk中添加了几行以包含这些库。 最终的Android.mk文件如下所示:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
dumpsys.cpp
LOCAL_SHARED_LIBRARIES := \
libutils \
liblog \
libbinders
ANDROID_SRC="my android source directory"
LOCAL_C_INCLUDES := ${ANDROID_SRC}/frameworks/native/include \
${ANDROID_SRC}/system/core/include
#$(warning $(TARGET_C_INCLUDES))
LOCAL_MODULE:= dumpsys
TARGET_ARCH := arm
TARGET_ARCH_ABI := armeabi-v7a
include $(BUILD_EXECUTABLE)
执行ndk-build时,出现以下错误:
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:144: error: undefined reference to 'android::String16::~String16()'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:240: error: undefined reference to 'android::VectorImpl::finish_vector()'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:241: error: undefined reference to 'android::VectorImpl::~VectorImpl()'
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:135: error: undefined reference to 'android::String16::String16()'
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:154: error: undefined reference to 'android::String16::String16(android::String16 const&)'
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:166: error: undefined reference to 'android::String16::String16(android::String16 const&)'
/home/mahdi/university/androidsource/system/core/include/utils/String16.h:178: error: undefined reference to 'strzcmp16'
/home/mahdi/university/androidsource/system/core/include/utils/StrongPointer.h:143: error: undefined reference to 'android::RefBase::decStrong(void const*) const'
jni/dumpsys.cpp:32: error: undefined reference to 'android::defaultServiceManager()'
jni/dumpsys.cpp:35: error: undefined reference to '__android_log_print'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:224: error: undefined reference to 'android::VectorImpl::VectorImpl(unsigned int, unsigned int)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:224: error: undefined reference to 'android::VectorImpl::VectorImpl(unsigned int, unsigned int)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:245: error: undefined reference to 'android::VectorImpl::operator=(android::VectorImpl const&)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:378: error: undefined reference to 'android::VectorImpl::sort(int (*)(void const*, void const*))'
jni/dumpsys.cpp:49: error: undefined reference to 'android::String16::String16(char const*)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338: error: undefined reference to 'android::VectorImpl::add(void const*)'
jni/dumpsys.cpp:49: error: undefined reference to 'android::String16::~String16()'
jni/dumpsys.cpp:51: error: undefined reference to 'android::String16::String16(char const*)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338: error: undefined reference to 'android::VectorImpl::add(void const*)'
jni/dumpsys.cpp:51: error: undefined reference to 'android::String16::~String16()'
jni/dumpsys.cpp:53: error: undefined reference to 'android::String16::String16(char const*)'
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338: error: undefined reference to 'android::VectorImpl::add(void const*)'
jni/dumpsys.cpp:53: error: undefined reference to 'android::String16::~String16()'
jni/dumpsys.cpp:66: error: undefined reference to 'android::operator<<(android::TextOutput&, android::String16 const&)'
jni/dumpsys.cpp:81: error: undefined reference to 'android::operator<<(android::TextOutput&, android::String16 const&)'
jni/dumpsys.cpp:89: error: undefined reference to 'android::operator<<(android::TextOutput&, android::String16 const&)'
/home/mahdi/university/androidsource/system/core/include/utils/StrongPointer.h:143: error: undefined reference to 'android::RefBase::decStrong(void const*) const'
jni/dumpsys.cpp:94: error: undefined reference to 'android::aerr'
jni/dumpsys.cpp:94: error: undefined reference to 'android::aout'
collect2: error: ld returned 1 exit status
我应该如何解决这个问题?
提前致谢。
我正在处理类似的问题。
基本上,dumpsys是AOSP组件,旨在与AOSP工具链一起构建。 您将需要进行一些调整,以将其移植到NDK –包括${ANDROID_SRC}
是第一步,但不是全部。
您已经成功包含了标头,从而使编译器满意。 现在,链接器在抱怨,因为它找不到您要链接的库。 好消息是它们是共享库,因此在构建时不存在严格的要求。
NDK的定义库的一个稳定的API,你可以使用,这是记录在这里 。 liblog
在该列表中,可以通过在Android.mk
添加以下几行来包括它:
LOCAL_LDLIBS := \
-llog \
另外两个库不是稳定API的一部分。 从本质上讲,这意味着即使您的代码在特定版本的Android上运行,也可能会在任何更高版本上中断,因为API可能已更改–您可能要牢记这一点。
由于这些库是共享的,因此ld所做的所有工作就是检查它们是否确实提供了您正在使用的功能。 该问题及其公认的答案提供了摆脱相关错误消息的说明:
一种方法是使用类似:
LOCAL_LDFLAGS := -Wl,--unresolved-symbols=ignore-all
但是,这将绕过所有检查–因此,如果您尝试使用库中确实不存在的函数,则ld
没有机会警告您。
较干净,但工作量较大的方法是提供存根库。 存根库本质上是一个虚拟库,它定义与“真实”事物相同的符号(函数等),但是没有实现(函数只是不做任何事情就返回)。 使链接器满意就足够了,但是没有提供这些库,并且在运行时使用它们的“真实”对应物。
您将需要获取这两个库的源代码,它们位于以下目录中: libutils
和libbinders
system/core/libutils
frameworks/native/libs/binder
将这两个目录复制到项目的jni
目录中。 然后剥离代码:*编辑Android.mk
,除去BUILD_SHARED_LIBRARY
以外的所有构建目标。 *编辑源代码文件,用简单的return
替换所有功能体。 只要您可以编译代码,返回什么都无所谓。
最终,您可能需要阻止存根库包含在您的.apk
(我还没有弄清楚该怎么做)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.