未定义对__android_log_print的引用


100

我的make文件怎么了?

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := foo
LOCAL_SRC_FILES := foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

foo.c

#include <string.h>
#include <jni.h>
#include <android/log.h>

#define  LOG_TAG    "foo"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

void test() {
    LOGI("test");
}

ndk构建

foo.c:9: undefined reference to `__android_log_print'

Answers:


89

Android.mk文件中尝试以下操作:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

1
添加这个有什么必要?您能详细解释一下吗?
Dhasneem

它在制作文件中添加了一个android库-它也对我
有用

9
-L是不必要的。请改接受其他答案。
Jeff Allen

5
如果在Android Studio 1.3中使用新的Gradle NDK集成,则需要添加ldLibs = ["android", "log"]到android.ndk选项
Stephen Kaiser

1
如果我们不使用Android.mk,该怎么办?
cagdas

99

您需要添加

LOCAL_LDLIBS := -llog

到Android.mk


1
正确。如果有多个库,则需要为每个库添加此语句(在CLEAR VARS之后)
user13107'1

86

如果您使用Android Studio和gradle,它将忽略Android.mk。将此添加到您的build.gradle文件中:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}

7
我不知道在哪里记录。我也在寻找这个。
Randy Sugianto'Yuku'2014年

1
在添加之前,我得到了“对'__android_log_print'的未定义引用” ldLibs。谢谢。
丹尼斯·克尼亚热夫

2
添加此修复程序对我来说。只需确保将ndk部分添加到build.gradle app文件夹内,而不是项目文件夹(模块名)中即可。
mathiass 2015年

从Gradle 2.5开始,请使用'ldLibs + =“ log”'稍作语法更改
Lorne K

15
这对我不起作用。这是我必须做的:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ

29

对于使用CMake的Android Studio 2.2和tools.build:gradle:2.2.0,在CMakeLists.txt中添加或编辑行:

target_link_libraries(<your_library_name> 
                      android 
                      log)

多数民众赞成将日志库连接到您的。


16

如果您升级到Android Studio 2.1,则以上答案无效,需要使用ldLibs.add()来加载库,如下所示:

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}

最佳现代(2017年末)答案
Edgar Aroutiounian

7

我们可以通过3种方式链接Android中的共享库。在以下3种情况下,应将提及的行添加到Android.mk

所以这是三种方式。

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

由于某些原因,如果1不起作用(它对我不起作用),您可以尝试以下2种方法

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

当然,您还需要#include <android/log.h> 在C / H文件中包含该文件。


6

如果您正在从事的项目具有与其他“标准”答案不同的以下特征:

  • 不使用Android Studio
  • 不使用gradle和集成的CMake
  • 完全不使用Android.mk或Application.mk进行构建
  • 直接使用CMake和工具链(也许您的项目基于Qt,而没有使用QtCreator)

以下target_link_libraries用法可以实现:

    find_library(ANDROID_LOG_LIB log)
    target_link_libraries(${TARGET_NAME} ${ANDROID_LOG_LIB})

作为TARGET_NAME目标的构建(将其具有它与之前的名称add_libraryadd_executable)。

find_library同样重要的是,以及适当地设定了工具链(透过Android SDK在所提供的工具链ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake所以它建立CMAKE_SYSROOT其通过使用find_命令)。


唯一可以帮助我的解决方案!非常感谢,我将通过一个测试来扩展它,如果找到该库可以为开发人员提供更好的反馈,请点击这里stackoverflow.com/a/37868829/10030695
ManuelTS

4

是的,您确实需要添加:LOCAL_LDLIBS := -llog如已指定其他答案/评论,但是原始问题未指定他是否将jni库用作:LOCAL_JNI_SHARED_LIBRARIES或as LOCAL_REQUIRED_MODULES

我可以肯定地说,他将它用作:LOCAL_REQUIRED_MODULES因为存在LOCAL_EXPORT_LDLIBS := -llog问题...除非在编辑后添加了它。

如果使用LOCAL_REQUIRED_MODULES共享库,则将其安装在/ system / lib中而不是安装到apk中,因为它是必需的模块。因此,您将需要添加LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog而不只是添加内容,LOCAL_LDLIBS := -llog以便在构建系统构建和链接jni共享库时,它将-llog在正确的位置具有定义,可在下定义$OUT/root/system/lib。否则,即使仅添加,您也将继续获得相同的答案LOCAL_LDLIBS := -llog

因此,那些评论说-L不需要且其他答案是正确的人,在这种情况下实际上是错误的。


感谢您实际解释发生了什么!
理查德

4

代替

如果在Android Studio 1.3中使用新的Gradle NDK集成,则需要将ldLibs = [“ android”,“ log”]添加到android.ndk选项中– Stephen Kaiser 9月24日4:20

使用ldLibs.addAll(["android", "log"])的实验插件


3

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

到Android.mk


2
为什么?请解释为什么这个答案应该适用于询问者。
L0j1k 2014年

1

这对我有帮助:

Android.mk

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

LOCAL_MODULE    := nativeDemo
LOCAL_SRC_FILES := main.cpp
LOCAL_LDLIBS += -llog

include $(BUILD_SHARED_LIBRARY)

0

在Android Studio 2.2及更高版本中,创建新项目时对CPP具有内置支持。另外,默认情况下包含liblog.so。除了包含头文件(android / log.h),别无他法。

当我们创建新的Android Studio项目时,由Studio创建的Checkout app / CMakeLists.txt。我们可以看到loglib的find_library()块和target_link_libraries()块已经存在。

另外,请注意函数语法。它应该是:

__android_log_print(int优先级,const char * tag,const char * fmt,...);

就我而言,我遗漏了标记参数,最终花了3天的时间来弄清楚它。

有关CMake的更多信息:将C和C ++代码添加到您的项目中



0

添加 LOCAL_SHARED_LIBRARIES:= liblog 到Android.mk可以解决我的问题。这是因为__android_log_print在libLog中定义了


0

要使用Android.bp进行构建,请遵循以下解决方案:

在此-android_log_print是在NDK中定义的,为此,已经有一个库可用。使用带有shared_libs标记的“ liblog ”库,请参考以下代码:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.