有一些类似于我的问题,但似乎他们的解决方案对我不起作用。
我正在尝试使用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
我该如何解决这个问题?
提前致谢。
答案 0 :(得分:3)
我在这里处理类似的问题。
基本上,dumpsys是一个AOSP组件,打算用AOSP工具链构建。您需要应用一些调整将其移植到NDK - 包括来自${ANDROID_SRC}
的内容是第一步,但不是整个故事。
您已成功包含标头,从而使编译器感到满意。现在链接器正在抱怨,因为它无法找到您要链接的库。好消息是它们是共享库,因此在构建时拥有库并不是一个严格的要求。
NDK定义了一个可以使用的库的稳定API,记录为here。 liblog
位于该列表中,可以通过将以下行添加到Android.mk
来包含此内容:
LOCAL_LDLIBS := \
-llog \
其他两个库不是稳定API的一部分。这实际上意味着即使您的代码适用于特定版本的Android,它也可能会在任何更高版本中中断,因为API可能已更改 - 您可能需要牢记这一点。
由于这些库是共享的,所以ld会检查它们是否实际提供了您正在使用的功能。 This question及其接受的答案有关于删除相关错误消息的说明:
一种方法是使用类似的东西:
LOCAL_LDFLAGS := -Wl,--unresolved-symbols=ignore-all
但是,这将绕过所有检查 - 所以如果您尝试使用库中确实不存在的功能,ld
就没有机会警告您。
更简洁但更加工作密集的方法是提供存根库。存根库本质上是一个虚拟库,它定义了与&#34; real&#34;相同的符号(函数等)。事情但没有实现(函数只是返回而不做任何事情)。它足以使链接器满意,但是这些库并没有发货,它们的真实性很高。对应物在运行时使用。
您需要获取两个库的源代码,这两个库位于以下目录中:libutils
和libbinders
system/core/libutils
frameworks/native/libs/binder
将这两个目录复制到您的项目jni
目录中。然后删除代码:
*修改Android.mk
,删除BUILD_SHARED_LIBRARY
以外的所有构建目标。
*编辑源代码文件,用简单的return
替换所有函数体。只要你得到要编译的代码,那么你返回的内容并不重要。
最终,您可能需要阻止存根库包含在.apk
中(我还没弄清楚如何做到这一点)。