неопределенная ссылка на `__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-build

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

Ответы:


89

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

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

1
Что нужно добавить? Не могли бы вы объяснить подробно?
Dhasneem 07

он добавляет библиотеку Android в файл make - и у меня это тоже
сработало

9
-L не нужен. Вместо этого примите другой ответ.
Джефф Аллен

5
Если вы используете новую интеграцию Gradle NDK в Android Studio 1.3, вам необходимо добавить ldLibs = ["android", "log"]в свой android.ndk параметры
Стивен Кайзер,

1
Что, если мы не используем Android.mk?
cagdas

99

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

LOCAL_LDLIBS := -llog

на Android.mk


1
верный. если имеется несколько библиотек, необходимо добавить этот оператор для каждой из них (после CLEAR VARS)
user13107

86

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

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

7
Интересно, где это задокументировано. Я тоже это искал.
Рэнди Сугианто 'Yuku'

1
Я получал «неопределенную ссылку на '__android_log_print'» до того, как добавил ldLibs. Спасибо.
Денис Княжев

2
Добавление этого исправило это для меня. Просто не забудьте добавить ndkчасть в build.gradle внутри appпапки, а не в папку проекта (имя модуля).
mathiass 06

Начиная с Gradle 2.5, используйте 'ldLibs + = "log"' небольшое изменение синтаксиса
Lorne K

15
это НЕ сработало для меня. вот что я должен был сделать:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ

29

Для Android Studio 2.2 и tools.build:gradle:2.2.0 с помощью CMake добавьте или отредактируйте строку в 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 года) ответ
Эдгар Арутюнян 02

7

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


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_libraryили add_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или как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

Вместо

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

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


3

Добавить

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

на Android.mk


2
Зачем? Пожалуйста, объясните, почему этот ответ должен работать для спрашивающего.
L0j1k

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).

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

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

__android_log_print (приоритет int, тег const char *, 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, поэтому для этого уже есть библиотека. Используйте библиотеку " liblog " с тегом shared_libs , см. Приведенный ниже код:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.