неопределенная ссылка на `__android_log_print ' - PullRequest
95 голосов
/ 16 декабря 2010

Что не так с моим файлом 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-build

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

Ответы [ 12 ]

95 голосов
/ 31 января 2011

Вам необходимо добавить

LOCAL_LDLIBS := -llog

в Android.mk

85 голосов
/ 16 декабря 2010

Попробуйте следующее в вашем Android.mk файле:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
83 голосов
/ 04 декабря 2014

Если вы используете Android Studio и Gradle, он игнорирует Android.mk.Добавьте это в свой файл build.gradle:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}
29 голосов
/ 09 ноября 2016

Для Android Studio 2.2 и tools.build:gradle:2.2.0 с помощью CMake добавить или изменить строку в CMakeLists.txt:

target_link_libraries(<your_library_name> 
                      android 
                      log)

То есть подключение библиотеки журналов к вашей.

16 голосов
/ 05 мая 2016

Если вы обновляетесь до Android Studio 2.1, приведенные выше ответы не работают, необходимо использовать ldLibs.add () для загрузки библиотеки, как показано ниже:

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}
6 голосов
/ 09 октября 2014

Мы можем связать разделяемую библиотеку в 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.

4 голосов
/ 27 ноября 2015

Вместо

Если вы используете новую интеграцию Gradle NDK в Android Studio 1.3, вам нужно добавить ldLibs = ["android", "log"] в опции android.ndk - СтивенKaiser 24 сентября в 4:20

используйте ldLibs.addAll(["android", "log"]) для экспериментального плагина

3 голосов
/ 14 декабря 2017

Если проект, над которым вы работаете, имеет следующие характеристики, которые отличаются от других «стандартных» ответов:

  • Не используется 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 одинаково важны и для правильной настройки набора инструментов (используйте набор инструментов, предоставляемый Android SDK на ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake, чтобы он устанавливал CMAKE_SYSROOT, который используется командами find_).

3 голосов
/ 06 сентября 2014

Да, вам нужно добавить: LOCAL_LDLIBS := -llog, как указано в других ответах / комментариях, однако в исходном вопросе не было указано, использует ли он библиотеку jni как: LOCAL_JNI_SHARED_LIBRARIES или как 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 не нужен, а другой ответ был верным, они действительно были неверны в этой ситуации.

3 голосов
/ 15 апреля 2014

Добавить

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

до Android.mk

...