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'
ldLibs = ["android", "log"]
Ihre android.ndk-Optionen erweiternSie müssen hinzufügen
zu Android.mk
quelle
Wenn Sie Android Studio und gradle verwenden, wird Android.mk ignoriert. Fügen Sie dies Ihrer build.gradle-Datei hinzu:
quelle
ldLibs
. Vielen Dank.ndk
Stellen Sie einfach sicher, dass Sie das Teil in der build.gradle imapp
Ordner anstelle des Teils im Projektordner (Modulname) hinzufügen .ldLibs.addAll(["android", "log"])
Für Android Studio 2.2 und tools.build:gradle:2.2.0 mit CMake Zeile in CMakeLists.txt hinzufügen oder bearbeiten:
Das verbindet die Protokollbibliothek mit Ihrer.
quelle
Wenn Sie auf Android Studio 2.1 aktualisieren, funktionieren die obigen Antworten nicht. Verwenden Sie ldLibs.add (), um die Bibliothek wie folgt zu laden:
quelle
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 werden
Android.mk
Hier sind die drei Möglichkeiten.
Aus irgendeinem Grund, wenn 1 nicht funktioniert (es hat bei mir nicht funktioniert), können Sie unten 2 Möglichkeiten ausprobieren
Natürlich müssen Sie auch
#include <android/log.h>
in Ihre C / H-Datei aufnehmen.quelle
Falls das Projekt, an dem Sie arbeiten, die folgenden Merkmale aufweist, die sich von anderen Standardantworten unterscheiden:
Die folgende Verwendung von target_link_libraries macht es:
Da
TARGET_NAME
der Name des Ziels zu bauen (mit Set es oben , bevor sie mitadd_library
oderadd_executable
).find_library
ist 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.cmake
damitCMAKE_SYSROOT
die vonfind_
Befehlen verwendete Toolchain eingerichtet wird ).quelle
Ja, Sie müssen hinzufügen:
LOCAL_LDLIBS := -llog
wie in den anderen Antworten / Kommentaren angegeben, in der ursprünglichen Frage wurde jedoch nicht angegeben, ob er die jni-Bibliothek als:LOCAL_JNI_SHARED_LIBRARIES
oder als verwendetLOCAL_REQUIRED_MODULES
.Ich kann ziemlich sicher sagen, dass er es verwendet hat als:
LOCAL_REQUIRED_MODULES
wegen derLOCAL_EXPORT_LDLIBS := -llog
in der Frage ... es sei denn, das wurde nach einer Bearbeitung hinzugefügt.Wenn Sie
LOCAL_REQUIRED_MODULES
die 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 -llog
anstatt nur,LOCAL_LDLIBS := -llog
damit das Build-System beim Erstellen und Verknüpfen der gemeinsam genutzten jni-Bibliothek die-llog
Definitionen 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ügenLOCAL_LDLIBS := -llog
.Diejenigen, die kommentierten, dass das
-L
nicht benötigt wird und die andere Antwort richtig war, waren in dieser Situation tatsächlich falsch.quelle
Anstelle von
Verwendung
ldLibs.addAll(["android", "log"])
für das experimentelle Pluginquelle
Hinzufügen
zu Android.mk
quelle
Das hat mir geholfen:
Android.mk
quelle
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:
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
quelle
-DCMAKE_CXX_FLAGS = "- llog" hilft mir
quelle
add
LOCAL_SHARED_LIBRARIES:= liblog
to Android.mk kann meine isuue lösen. Dies liegt daran, dass das__android_log_print
in libLog definiert istquelle
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:
quelle