невизначена посилання на `__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-збірка

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

Відповіді:


89

Спробуйте наступне у вашому Android.mkфайлі:

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

1
Що потрібно до цього додати? Чи поясніть, будь ласка, детально?
Dhasneem

додавання бібліотеки Android для файлу make - і це працювало і для мене
gheese

9
-L непотрібне. Прийміть іншу відповідь замість цього.
Джефф Аллен

5
Якщо ви використовуєте нову інтеграцію Gradle NDK в Android Studio 1.3, вам потрібно додати ldLibs = ["android", "log"]до своїх опцій android.ndk
Stephen Kaiser,

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
Цікаво, де це задокументовано. Я також це шукав.
Ренді Сугіанто 'Юку'

1
Перш ніж я додав, я отримував "невизначене посилання на" __android_log_print " ldLibs. Дякую.
Денис Княжев

2
Додавши це, виправили це для мене. Просто переконайтесь, що додайте ndkчастину в build.gradle всередині appпапки замість тієї, що знаходиться в папці проекту (назва модуля).
mathiass

Станом на 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, вищевказані відповіді не спрацьовують, для завантаження lib, як показано нижче, скористайтеся ldLibs.add ().

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

найкраща сучасна (наприкінці 2017 року) відповідь
Едгар Арутьонійський

7

Ми можемо пов’язати спільну бібліотеку в Android 3-ма способами. У нижченаведених 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 файл.


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 - Stephen Kaiser 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

У андроїд-студії версії 2.2 і вище є вбудована підтримка CPP під час створення нового проекту. Також за замовчуванням включено liblog.so. Нічого не можна робити, крім включення файлу заголовка (android / log.h).

Checkout app / 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.