undefinierter Verweis auf `__android_log_print '


99

Was ist los mit meiner Make-Datei?

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'

Antworten:


89

Versuchen Sie Folgendes in Ihrer Android.mkDatei:

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

1
Was ist notwendig, um dies hinzuzufügen? Würden Sie bitte im Detail erklären?
Dhasneem

Es fügt eine Android-Bibliothek zur Make-Datei hinzu - und es hat auch bei mir
funktioniert

9
das -L ist nicht notwendig. Bitte akzeptieren Sie stattdessen die andere Antwort.
Jeff Allen

5
Wenn Sie die neue Gradle NDK-Integration in Android Studio 1.3 verwenden, müssen Sie ldLibs = ["android", "log"]Ihre android.ndk-Optionen erweitern
Stephen Kaiser

1
Was ist, wenn wir Android.mk nicht verwenden?
Cagdas

99

Sie müssen hinzufügen

LOCAL_LDLIBS := -llog

zu Android.mk


1
richtig. Wenn es mehrere Bibliotheken gibt, müssen Sie diese Anweisung für jede von ihnen hinzufügen (nach CLEAR VARS)
user13107

86

Wenn Sie Android Studio und gradle verwenden, wird Android.mk ignoriert. Fügen Sie dies Ihrer build.gradle-Datei hinzu:

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

7
Ich frage mich, wo dies dokumentiert ist. Ich habe auch danach gesucht.
Randy Sugianto 'Yuku'

1
Ich habe "undefinierten Verweis auf '__android_log_print'" erhalten, bevor ich hinzugefügt habe ldLibs. Vielen Dank.
Denis Kniazhev

2
Das Hinzufügen hat es für mich behoben. ndkStellen Sie einfach sicher, dass Sie das Teil in der build.gradle im appOrdner anstelle des Teils im Projektordner (Modulname) hinzufügen .
Mathiass

Ab Gradle 2.5 verwenden Sie 'ldLibs + = "log"' leichte Syntaxänderung
Lorne K

15
Das hat bei mir NICHT funktioniert. Das musste ich tun:ldLibs.addAll(["android", "log"])
4.

29

Für Android Studio 2.2 und tools.build:gradle:2.2.0 mit CMake Zeile in CMakeLists.txt hinzufügen oder bearbeiten:

target_link_libraries(<your_library_name> 
                      android 
                      log)

Das verbindet die Protokollbibliothek mit Ihrer.


16

Wenn Sie auf Android Studio 2.1 aktualisieren, funktionieren die obigen Antworten nicht. Verwenden Sie ldLibs.add (), um die Bibliothek wie folgt zu laden:

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

beste moderne (Ende 2017) Antwort
Edgar Aroutiounian

7

Wir können eine gemeinsam genutzte Bibliothek in Android auf drei Arten verknüpfen. In weniger als 3 Fällen sollten die genannten Zeilen hinzugefügt werdenAndroid.mk

Hier sind die drei Möglichkeiten.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Aus irgendeinem Grund, wenn 1 nicht funktioniert (es hat bei mir nicht funktioniert), können Sie unten 2 Möglichkeiten ausprobieren

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

Natürlich müssen Sie auch #include <android/log.h> in Ihre C / H-Datei aufnehmen.


6

Falls das Projekt, an dem Sie arbeiten, die folgenden Merkmale aufweist, die sich von anderen Standardantworten unterscheiden:

  • Android Studio wird nicht verwendet
  • Ohne Gradle und das integrierte CMake
  • Kein Android.mk oder Application.mk wird zum Erstellen verwendet
  • Verwenden Sie CMake und die Toolchain direkt (möglicherweise basiert Ihr Projekt auf Qt und ohne QtCreator auch nicht)

Die folgende Verwendung von target_link_libraries macht es:

    find_library(ANDROID_LOG_LIB log)
    target_link_libraries(${TARGET_NAME} ${ANDROID_LOG_LIB})

Da TARGET_NAMEder Name des Ziels zu bauen (mit Set es oben , bevor sie mit add_libraryoder add_executable).

find_libraryist ebenso wichtig wie das ordnungsgemäße Einrichten der Toolchain (verwenden Sie die vom Android SDK bereitgestellte Toolchain unter, ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakedamit CMAKE_SYSROOTdie von find_Befehlen verwendete Toolchain eingerichtet wird ).


Einzige Lösung, die mir geholfen hat! Vielen Dank, ich würde es um einen Test erweitern, wenn die Bibliothek für ein besseres Feedback an den Entwickler gefunden würde, wie hier stackoverflow.com/a/37868829/10030695
ManuelTS

4

Ja, Sie müssen hinzufügen: LOCAL_LDLIBS := -llogwie in den anderen Antworten / Kommentaren angegeben, in der ursprünglichen Frage wurde jedoch nicht angegeben, ob er die jni-Bibliothek als: LOCAL_JNI_SHARED_LIBRARIESoder als verwendet LOCAL_REQUIRED_MODULES.

Ich kann ziemlich sicher sagen, dass er es verwendet hat als: LOCAL_REQUIRED_MODULESwegen der LOCAL_EXPORT_LDLIBS := -llogin der Frage ... es sei denn, das wurde nach einer Bearbeitung hinzugefügt.

Wenn Sie LOCAL_REQUIRED_MODULESdie gemeinsam genutzte Bibliothek verwenden, wird diese in / system / lib anstatt in der apk installiert, da dies ein erforderliches Modul ist. Daher müssen Sie hinzufügen, LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lloganstatt nur, LOCAL_LDLIBS := -llogdamit das Build-System beim Erstellen und Verknüpfen der gemeinsam genutzten jni-Bibliothek die -llogDefinitionen an der richtigen Stelle hat, unter der es erstellt werden kann $OUT/root/system/lib. Andernfalls erhalten Sie weiterhin die gleiche Antwort, auch wenn Sie nur hinzufügen LOCAL_LDLIBS := -llog.

Diejenigen, die kommentierten, dass das -Lnicht benötigt wird und die andere Antwort richtig war, waren in dieser Situation tatsächlich falsch.


Vielen Dank, dass Sie tatsächlich erklärt haben, was los ist!
Richard

4

Anstelle von

Wenn Sie die neue Gradle NDK-Integration in Android Studio 1.3 verwenden, müssen Sie Ihren android.ndk-Optionen ldLibs = ["android", "log"] hinzufügen - Stephen Kaiser 24. September um 4:20 Uhr

Verwendung ldLibs.addAll(["android", "log"])für das experimentelle Plugin


3

Hinzufügen

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

zu Android.mk


2
Warum? Bitte erläutern Sie, warum diese Antwort für den Fragesteller funktionieren sollte.
L0j1k

1

Das hat mir geholfen:

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

In Android Studio Version 2.2 und höher gibt es eine integrierte Unterstützung für CPP, wenn Sie ein neues Projekt erstellen. Außerdem ist die Datei liblog.so standardmäßig enthalten. Außer der Header-Datei (android / log.h) ist nichts zu tun.

Checkout app / CMakeLists.txt, die vom Studio erstellt wird, wenn wir ein neues Android Studio-Projekt erstellen. Wir können sehen, dass der Block find_library () und der Block target_link_libraries () für loglib bereits vorhanden sind.

Achten Sie auch auf die Funktionssyntax. Es sollte sein:

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

In meinem Fall hatte ich den Tag-Parameter weggelassen und am Ende gute 3 Tage damit verbracht, ihn herauszufinden.

Weitere Informationen zu CMake: Fügen Sie Ihrem Projekt C- und C ++ - Code hinzu



0

add LOCAL_SHARED_LIBRARIES:= liblog to Android.mk kann meine isuue lösen. Dies liegt daran, dass das __android_log_printin libLog definiert ist


0

Um mit Android.bp zu erstellen, folgen Sie der folgenden Lösung:

In diesem Fall ist android_log_print im NDK definiert, daher ist bereits eine Bibliothek verfügbar. Verwenden Sie die Bibliothek " liblog " mit dem Tag shared_libs. Beachten Sie dabei den folgenden Code:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.