对__android_log_print'的未定义引用

ale*_*2k8 96 java-native-interface logging android android-ndk

我的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)
Run Code Online (Sandbox Code Playgroud)

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");
}
Run Code Online (Sandbox Code Playgroud)

NDK建造

foo.c:9: undefined reference to `__android_log_print'
Run Code Online (Sandbox Code Playgroud)

小智 97

你需要添加

LOCAL_LDLIBS := -llog
Run Code Online (Sandbox Code Playgroud)

到Android.mk


Rya*_*ves 87

在您的Android.mk文件中尝试以下内容:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
Run Code Online (Sandbox Code Playgroud)

  • -L是不必要的.请接受其他答案. (9认同)
  • 如果在Android Studio 1.3中使用新的Gradle NDK集成,则需要将`ldLibs = ["android","log"]`添加到android.ndk选项中 (5认同)

Bor*_*edT 83

如果您使用Android Studio和gradle,则会忽略Android.mk.将其添加到build.gradle文件中:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不适合我.这就是我必须要做的事情:`ldLibs.addAll(["android","log"])` (15认同)
  • 我想知道这是哪里记录的.我也在寻找这个. (7认同)
  • 添加此修复它为我.只需确保在`app`文件夹中的build.gradle中添加`ndk`部分,而不是项目文件夹(模块名称)中的部分. (2认同)

小智 29

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

target_link_libraries(<your_library_name> 
                      android 
                      log)
Run Code Online (Sandbox Code Playgroud)

这就是将日志库连接到你的库.


小智 16

如果您升级到Android Studio 2.1,上面的答案不起作用,需要使用ldLibs.add()来加载lib,如下所示:

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}
Run Code Online (Sandbox Code Playgroud)


DNa*_*Nax 9

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

  • 不使用 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})
Run Code Online (Sandbox Code Playgroud)

作为TARGET_NAME要构建的目标的名称(之前已使用add_library或进行设置add_executable)。

find_library与正确设置工具链同样重要(使用 Android SDK 提供的工具链,ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake以便设置CMAKE_SYSROOTfind_命令使用的工具链)。


mk.*_*k.. 6

我们可以通过3种方式链接Android中的共享库.在以下3个案例中,应加入所述行Android.mk

所以这有三种方式.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog
Run Code Online (Sandbox Code Playgroud)

出于某种原因,如果1不起作用(它对我不起作用),你可以尝试以下两种方式

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog
Run Code Online (Sandbox Code Playgroud)

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