référence indéfinie à `__android_log_print ‘

Quel est le problème avec mon fichier de création?

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  #include  #include  #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' 

Essayez ce qui suit dans votre fichier Android.mk :

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

Vous devez append

 LOCAL_LDLIBS := -llog 

vers Android.mk

Si vous utilisez Android Studio et graduez, il ignore Android.mk. Ajoutez ceci à votre fichier build.gradle:

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

Pour Android Studio 2.2 et tools.build:gradle:2.2.0 à l’aide de CMake, ajoutez ou modifiez la ligne dans CMakeLists.txt:

 target_link_libraries( android log) 

C’est la connexion de la bibliothèque de journaux à la vôtre.

Si vous effectuez une mise à niveau vers Android Studio 2.1, les réponses ci-dessus ne fonctionnent pas, vous devez utiliser ldLibs.add () pour charger la lib ci-dessous:

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

Nous pouvons associer une bibliothèque partagée sous Android de 3 manières. Dans moins de 3 cas, les lignes mentionnées doivent être ajoutées dans Android.mk

Alors, voici les trois façons.

 1. LOCAL_LDLIBS way LOCAL_LDLIBS := -llog 

Pour une raison quelconque si 1 ne fonctionne pas (cela ne fonctionnait pas pour moi), vous pouvez essayer ci-dessous 2 façons

 2. LOCAL_LDFLAGS way LOCAL_LDFLAGS := -llog 3. LOCAL_SHARED_LIBRARIES way LOCAL_SHARED_LIBRARIES += liblog 

Bien sûr, vous devez également inclure #include dans votre fichier C / H.

Au lieu de

Si vous utilisez la nouvelle intégration Gradle NDK dans Android Studio 1.3, vous devez append ldLibs = [“android”, “log”] à vos options android.ndk – Stephen Kaiser 24 septembre à 4:20

utiliser ldLibs.addAll(["android", "log"]) pour le plugin expérimental

Ajouter

 LOCAL_SHARED_LIBRARIES:= \ libbinder \ liblog \ 

vers Android.mk

Oui, vous devez append: LOCAL_LDLIBS := -llog car les autres réponses / commentaires ont été spécifiés, mais la question d’origine n’a pas précisé s’il utilisait la bibliothèque jni comme: LOCAL_JNI_SHARED_LIBRARIES ou LOCAL_REQUIRED_MODULES .

Je peux dire à peu près qu’il l’a utilisé comme: LOCAL_REQUIRED_MODULES cause de LOCAL_EXPORT_LDLIBS := -llog dans la question … à moins que cela ait été ajouté après une modification.

Si vous utilisez LOCAL_REQUIRED_MODULES la bibliothèque partagée est installée dans / system / lib au lieu de dans l’apk, car c’est un module requirejs. Par conséquent, vous devrez append LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog au lieu de simplement LOCAL_LDLIBS := -llog sorte que lorsque le système de génération construit et lie la bibliothèque partagée jni, il aura le -llog définitions au bon endroit, disponibles pour être construites sous $OUT/root/system/lib . Sinon, vous continuerez à obtenir la même réponse, même si vous n’ajoutez que LOCAL_LDLIBS := -llog .

Donc, ceux qui ont commenté que le -L n’est pas nécessaire, et l’autre réponse était correcte, ils étaient effectivement incorrects dans cette situation.

Cela m’a aidé:

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) 

Si le projet sur lequel vous travaillez présente les caractéristiques suivantes, différentes des autres réponses «standard»:

  • Ne pas utiliser Android Studio
  • Ne pas utiliser Gradle et le CMake intégré
  • Aucun Android.mk ou Application.mk utilisé pour la construction
  • Utiliser CMake et la chaîne d’outils directement (peut-être que votre projet est basé sur Qt et sans utiliser QtCreator non plus)

L’utilisation de target_link_libraries suivante le rend:

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

Étant donné que TARGET_NAME le nom de la cible à générer (après l’avoir configurée avec add_library ou add_executable ).

find_library est tout aussi important que de configurer correctement la chaîne d’outils (utilisez la chaîne d’outils fournie par le SDK Android à ANDROID_SDK_HOME/cmake//android.toolchain.cmake pour qu’il configure CMAKE_SYSROOT qui est utilisé par les commandes find_ ).

Dans la version 2.2 et supérieure d’Android Studio, il existe un support intégré pour CPP lorsque vous créez un nouveau projet. De plus, le liblog.so est inclus par défaut. Rien à faire à part d’inclure le fichier d’en-tête (android / log.h).

Checkout app / CMakeLists.txt qui est créé par le studio lorsque nous créons un nouveau projet de studio Android. Nous pouvons voir que le bloc find_library () et le bloc target_link_libraries () pour loglib sont déjà présents.

Faites également attention à la syntaxe de la fonction. CA devrait etre:

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

Dans mon cas, j’avais omis le paramètre tag et j’ai fini par passer 3 jours à le découvrir.

En savoir plus sur CMake: ajoutez du code C et C ++ à votre projet