Undefined ссылка на `__android_log_print '

Что случилось с моим файлом 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'

Ответ 1

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

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

Ответ 2

Вам нужно добавить

LOCAL_LDLIBS := -llog

на Android.mk

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

target_link_libraries(<your_library_name> 
                      android 
                      log)

Это соединение библиотеки журналов с вашим.

Ответ 6

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

Ответ 7

Вместо

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

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

Ответ 8

Добавить

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

на Android.mk

Ответ 9

Да, вам нужно добавить: 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 не нужны, и другой ответ был прав, в действительности они были неверными.

Ответ 10

Это помогло мне:

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)

Ответ 11

В студии Android версии 2.2 и выше встроенная поддержка CPP при создании нового проекта. Кроме того, liblog.so включен по умолчанию. Ничего не нужно делать, кроме заголовочного файла (android/log.h).

Приложение Checkout/CMakeLists.txt, созданное студией при создании нового проекта студии Android. Мы видим, что блок find_library() и блок target_link_libraries() для loglib уже присутствуют.

Также обратите внимание на синтаксис функции. Это должно быть:

__ android_log_print (int priority, const char * tag, const char * fmt,...);

В моем случае я оставил параметр тега и в итоге потратил 3 дня на то, чтобы понять его.

Подробнее о CMake: Добавить код C и С++ в ваш проект

Ответ 12

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

  • Не использовать 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_).