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'
alex2k8
quelle

Antworten:

89

Versuchen Sie Folgendes in Ihrer Android.mkDatei:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
Ryan Reeves
quelle
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

Kyle
quelle
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"
        }
    }
}
BoredT
quelle
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.

lewkka
quelle
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'])
}
DroidlikeCode
quelle
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.

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

DNax
quelle
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.

SudoSURoot
quelle
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

Sethbabs
quelle
3

Hinzufügen

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

zu Android.mk

user3535040
quelle
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)
NickUnuchek
quelle
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

Praveen Kumar KR
quelle
0

-DCMAKE_CXX_FLAGS = "- llog" hilft mir

James
quelle
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

nld2019
quelle
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,
        },
    },  
Budhdi Sharma
quelle