Android NDK错误:未定义的引用

Android NDK错误:未定义的引用,android,android-ndk,Android,Android Ndk,有一些问题与我的类似,但他们的解决方案似乎对我不起作用 我正在尝试使用Android NDK编译dumpsys源代码。我在Android.mk中添加了几行代码来包含这些库。 最后一个Android.mk文件如下所示: LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ dumpsys.cpp LOCAL_SHARED_LIBRARIES := \ libutils \

有一些问题与我的类似,但他们的解决方案似乎对我不起作用

我正在尝试使用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构建时,会出现以下错误:

/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
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:144:错误:未定义对“android::String16::~String16()的引用”
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:240:错误:未定义对“android::VectorImpl::finish_Vector()的引用”
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:241:错误:未定义对“android::VectorImpl::~VectorImpl()的引用”
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:135:错误:未定义对“android::String16::String16()的引用”
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:154:错误:未定义对“android::String16::String16(android::String16 const&)”的引用
/home/mahdi/university/androidsource/system/core/include/utils/TypeHelpers.h:166:错误:未定义对“android::String16::String16(android::String16 const&)”的引用
/home/mahdi/university/androidsource/system/core/include/utils/String16.h:178:错误:未定义对“strzcmp16”的引用
/home/mahdi/university/androidsource/system/core/include/utils/StrongPointer.h:143:错误:未定义对“android::RefBase::decStrong(void const*)const”的引用
jni/dumpsys.cpp:32:错误:未定义对“android::defaultServiceManager()的引用”
jni/dumpsys.cpp:35:错误:未定义对“\uuuuAndroid\uLog\uPrint”的引用
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:224:错误:未定义对“android::VectorImpl::VectorImpl(unsigned int,unsigned int)”的引用
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:224:错误:未定义对“android::VectorImpl::VectorImpl(unsigned int,unsigned int)”的引用
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:245:错误:未定义对“android::VectorImpl::operator=(android::VectorImpl const&)”的引用
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:378:错误:未定义对“android::VectorImpl::sort(int(*)(void const*,void const*)”的引用
jni/dumpsys.cpp:49:错误:未定义对“android::String16::String16(char const*)”的引用
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338:错误:未定义对“android::VectorImpl::add(void const*)”的引用
jni/dumpsys.cpp:49:错误:未定义对“android::String16::~String16()的引用”
jni/dumpsys.cpp:51:错误:未定义对“android::String16::String16(char const*)”的引用
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338:错误:未定义对“android::VectorImpl::add(void const*)”的引用
jni/dumpsys.cpp:51:错误:未定义对“android::String16::~String16()”的引用
jni/dumpsys.cpp:53:错误:未定义对“android::String16::String16(char const*)”的引用
/home/mahdi/university/androidsource/system/core/include/utils/Vector.h:338:错误:未定义对“android::VectorImpl::add(void const*)”的引用
jni/dumpsys.cpp:53:错误:未定义对“android::String16::~String16()”的引用

jni/dumpsys.cpp:66:错误:未定义对“android::operator”的引用我正在处理一个类似的问题

基本上,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
将这两个dir复制到项目的
jni
dir中。然后去掉代码: *编辑
Android.mk
,删除除
构建共享库
之外的所有构建目标。 *编辑源代码文件,用简单的
返回替换所有函数体。返回什么并不重要,只要得到要编译的代码

最终,您可能需要防止存根库包含在
.apk
中(我还没有弄清楚)