`__android_log_print ‘에 대한 정의되지 않은 참조 := foo LOCAL_SRC_FILES :=

내 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'



답변

Android.mk파일 에서 다음을 시도 하십시오.

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


답변

추가해야합니다.

LOCAL_LDLIBS := -llog

Android.mk로


답변

Android Studio 및 gradle을 사용하는 경우 Android.mk를 무시합니다. build.gradle 파일에 다음을 추가하십시오.

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


답변

Android Studio 2.2 및 tools.build:gradle:2.2.0의 경우 CMake를 사용하여 CMakeLists.txt에서 행을 추가하거나 편집합니다.

target_link_libraries(<your_library_name>
                      android
                      log)

로그 라이브러리를 연결하는 것입니다.


답변

Android Studio 2.1로 업그레이드하면 위의 답변이 작동하지 않으므로 ldLibs.add ()를 사용하여 아래와 같이 lib를로드해야합니다.

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


답변

Android에서 공유 라이브러리를 3 가지 방법으로 연결할 수 있습니다. 3 개 이하의 경우 언급 된 줄을Android.mk

여기에 세 가지 방법이 있습니다.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

어떤 이유로 1이 작동하지 않으면 (나에게 적합하지 않음), 아래 두 가지 방법을 시도 할 수 있습니다.

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

물론 #include <android/log.h> C / H 파일 에도 포함시켜야 합니다.


답변

작업중인 프로젝트에 다른 ‘표준’답변과 다른 다음과 같은 특성이있는 경우 :

  • 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_library또는 add_executable).

find_library물론 제대로 툴체인을 설정으로 (안드로이드 SDK에서 제공하는 툴체인을 사용 똑같이 중요 ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake이 설정되도록 CMAKE_SYSROOT에서 사용되는 find_명령).