对“__android_log_print”的未定义引用

undefined reference to '__android_log_print'

我已经在模拟器上编译 运行 Android 8。我想在 AOSP 中安装和打开应用程序时查看 ART 的行为。我将此行添加到 dex2aot.cc 文件:

#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-lib", __VA_ARGS__))
#define LOG_TAG "foo"

还有这个LOGI("DOOOOOOOOTOOOOOOOOOOOOOOOO");

~Dex2Oat() {
// Log completion time before deleting the runtime_, because this accesses
// the runtime.

LOGI("DOOOOOOOOTOOOOOOOOOOOOOOOO");

LogCompletionTime();

我还在包含以下内容的 dex2aot 文件夹中创建了 android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SHARED_LIBRARIES:= liblog

然后我运行这些命令

source build/envsetup.sh
lunch aosp_arm-eng
make -j8

我收到 undefined reference 错误。我查找了错误,但大多数解决方案都非常陈旧。有什么新的解决办法吗?我应该修改构建文件夹中的 android.mk 吗?感谢您的帮助。

此致,

I also created android.mk in the dex2oat folder

这不起作用。在 Android.mk 中声明模块的模式是,例如用于创建二进制文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
...
LOCAL_MODULE := name_of_your_module
include $(BUILD_EXECUTABLE)

这定义了一个新模块name_of_your_module,它是可执行文件类型。然后,您可以填写有关模块的详细信息来代替 ...,例如,您可以使用 LOCAL_SRC_FILES := ... 或 link 添加源文件,而不是使用 LOCAL_SHARED_LIBRARIES := ....[= 的共享库30=]

在您发布的代码中,您给出了 LOCAL_SHARED_LIBRARIES 声明,但我没有看到围绕它的模块声明。所以构建系统无法知道哪个模块想要 link 反对 liblog。因此,当您想要针对 liblog 声明一个新模块 linking 时,您必须确保您的 LOCAL_SHARED_LIBRARIES 介于 include $(CLEAR_VARS)LOCAL_MODULE := ... / include $(BUILD_EXECUTABLE)(或其他模块类型,以防您要构建静态或共享库)。

但是,这仅适用于您要创建新模块的情况。据我了解,您实际上并不想创建一个新模块,而是向现有模块添加 linker 依赖项,即 dex2oat。为此,您必须修改 dex2oat 的现有模块声明。现在你说你正在使用 Android 8,这个模块是在 ./art/dex2oat/Android.bp 中声明的。为在 Android.bp 中声明的现有模块创建新的 Android.mk 将不起作用。相反,您必须修改 Android.bp.

./art/dex2oat/Android.bp中找到dex2oat的模块声明:

art_cc_binary {
    name: "dex2oat",
    defaults: [
        "dex2oat-defaults",
    ],
    shared_libs: [
        "libart",
        "libart-compiler",
        "libbase",
        "libsigchain",
    ],
}

shared_libs 列表中,添加你想要 link 反对的库,所以在你的情况下,"liblog".