gpt4 book ai didi

Android NDK 错误 : undefined reference

转载 作者:搜寻专家 更新时间:2023-11-01 08:41:31 24 4
gpt4 key购买 nike

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

我正在尝试使用 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} 的内容是第一步,但不是全部。

您已经成功地包含了 header ,从而使编译器满意。现在链接器正在提示,因为它找不到您要链接的库。好消息是它们是共享库,因此在构建时拥有这些库并不是一个严格的要求。

NDK 为您可以使用的库定义了一个稳定的 API,记录在案 here . liblog 在该列表中,可以通过将以下行添加到 Android.mk 来包含:

LOCAL_LDLIBS := \
-llog \

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

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

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

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

但是,这将绕过所有检查——因此,如果您尝试使用库中确实不存在的函数,ld 没有机会警告您。

更简洁但工作量更大的方法是提供 stub 库。 stub 库本质上是一个虚拟库,它定义了与“真实”事物相同的符号(函数等),但没有实现(函数只是返回而不做任何事情)。这足以让链接器满意,但这些库并未交付,而是在运行时使用它们的“真实”副本。

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

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

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

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

关于Android NDK 错误 : undefined reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32107722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com