Android NDK错误:未定义的引用

时间:2015-08-20 00:26:09

标签: 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 \
        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

我该如何解决这个问题?

提前致谢。

1 个答案:

答案 0 :(得分:3)

我在这里处理类似的问题。

基本上,dumpsys是一个AOSP组件,打算用AOSP工具链构建。您需要应用一些调整将其移植到NDK - 包括来自${ANDROID_SRC}的内容是第一步,但不是整个故事。

您已成功包含标头,从而使编译器感到满意。现在链接器正在抱怨,因为它无法找到您要链接的库。好消息是它们是共享库,因此在构建时拥有库并不是一个严格的要求。

NDK定义了一个可以使用的库的稳定API,记录为hereliblog位于该列表中,可以通过将以下行添加到Android.mk来包含此内容:

LOCAL_LDLIBS := \
  -llog \

其他两个库不是稳定API的一部分。这实际上意味着即使您的代码适用于特定版本的Android,它也可能会在任何更高版本中中断,因为API可能已更改 - 您可能需要牢记这一点。

由于这些库是共享的,所以ld会检查它们是否实际提供了您正在使用的功能。 This question及其接受的答案有关于删除相关错误消息的说明:

一种方法是使用类似的东西:

LOCAL_LDFLAGS := -Wl,--unresolved-symbols=ignore-all

但是,这将绕过所有检查 - 所以如果您尝试使用库中确实不存在的功能,ld就没有机会警告您。

更简洁但更加工作密集的方法是提供存根库。存根库本质上是一个虚拟库,它定义了与&#34; real&#34;相同的符号(函数等)。事情但没有实现(函数只是返回而不做任何事情)。它足以使链接器满意,但是这些库并没有发货,它们的真实性很高。对应物在运行时使用。

您需要获取两个库的源代码,这两个库位于以下目录中:libutilslibbinders

system/core/libutils
frameworks/native/libs/binder

将这两个目录复制到您的项目jni目录中。然后删除代码: *修改Android.mk,删除BUILD_SHARED_LIBRARY以外的所有构建目标。 *编辑源代码文件,用简单的return替换所有函数体。只要你得到要编译的代码,那么你返回的内容并不重要。

最终,您可能需要阻止存根库包含在.apk中(我还没弄清楚如何做到这一点)。