référence non définie à «__android_log_print»


100

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)

toto.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'

Réponses:


89

Essayez ce qui suit dans votre Android.mkfichier:

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

1
Quel est le nécessaire pour ajouter cela? Pouvez-vous expliquer en détail?
Dhasneem

il ajoute une bibliothèque Android au fichier make - et cela a fonctionné pour moi aussi
gheese

9
le -L n'est pas nécessaire. Veuillez accepter l'autre réponse à la place.
Jeff Allen

5
Si vous utilisez la nouvelle intégration Gradle NDK dans Android Studio 1.3, vous devez ajouter ldLibs = ["android", "log"]à vos options android.ndk
Stephen Kaiser

1
Et si nous n'utilisons pas Android.mk?
cagdas

99

Vous devez ajouter

LOCAL_LDLIBS := -llog

sur Android.mk


1
correct. s'il y a plusieurs bibliothèques, vous devez ajouter cette instruction pour chacune d'elles (après CLEAR VARS)
user13107

86

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

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

7
Je me demande où cela est documenté. Je cherchais cela aussi.
Randy Sugianto 'Yuku'

1
J'obtenais "une référence indéfinie à '__android_log_print'" avant que j'aie ajouté ldLibs. Merci.
Denis Kniazhev

2
L'ajout de cela l'a corrigé pour moi. Assurez-vous simplement d'ajouter la ndkpartie dans le build.gradle dans le appdossier au lieu de celle du dossier du projet (nom du module).
mathiass

À partir de Gradle 2.5, utilisez 'ldLibs + = "log"' léger changement de syntaxe
Lorne K

15
Cela n'a pas fonctionné pour moi. ldLibs.addAll(["android", "log"])
voici

29

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

target_link_libraries(<your_library_name> 
                      android 
                      log)

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


16

Si vous mettez à niveau vers Android Studio 2.1, les réponses ci-dessus ne fonctionnent pas, vous devez utiliser ldLibs.add () pour charger la bibliothèque comme ci-dessous:

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

meilleure réponse moderne (fin 2017)
Edgar Aroutiounian

7

Nous pouvons lier une bibliothèque partagée dans Android de 3 manières. Dans les cas ci-dessous 3, les lignes mentionnées doivent être ajoutées dansAndroid.mk

Voici donc les trois façons.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Pour une raison quelconque, si 1 ne fonctionne pas (cela n'a pas fonctionné 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 <android/log.h> dans votre fichier C / H.


6

Dans le cas où le projet sur lequel vous travaillez présente les caractéristiques suivantes qui diffèrent 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é du tout pour la construction
  • Utilisation de CMake et de la chaîne d'outils directement (peut-être que votre projet est basé sur Qt et sans utiliser QtCreator non plus)

L' utilisation suivante de target_link_libraries en fait:

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

Être TARGET_NAMEle nom de la cible à construire (après l'avoir configuré avec add_libraryou add_executable).

find_libraryest tout aussi important que de configurer correctement la chaîne d'outils (utilisez la chaîne d'outils fournie par Android SDK ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakepour qu'elle configure ce CMAKE_SYSROOTqui est utilisé par les find_commandes).


Seule solution qui m'a aidé! Merci beaucoup, je l'étendrais par un test si la bibliothèque était trouvée pour un meilleur retour d'information au développeur comme ici stackoverflow.com/a/37868829/10030695
ManuelTS

4

Oui, vous devez ajouter: LOCAL_LDLIBS := -llogcomme les autres réponses / commentaires l'ont spécifié, mais la question d'origine ne précisait pas s'il utilisait la bibliothèque jni comme: LOCAL_JNI_SHARED_LIBRARIESou comme LOCAL_REQUIRED_MODULES.

Je peux à peu près dire avec certitude qu'il l'a utilisé comme: à LOCAL_REQUIRED_MODULEScause de LOCAL_EXPORT_LDLIBS := -llogla question ... à moins que cela n'ait été ajouté après une modification.

Si vous utilisez LOCAL_REQUIRED_MODULESla bibliothèque partagée est installée dans / system / lib au lieu de dans l'apk, car il s'agit d'un module obligatoire. Par conséquent, vous devrez ajouter LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llogau lieu de juste LOCAL_LDLIBS := -llogpour que lorsque le système de construction construit et lie la bibliothèque partagée jni, il ait les -llogdé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 fait remarquer que le -Ln'est pas nécessaire, et l'autre réponse était correcte, ils étaient en fait inexacts dans cette situation.


Merci d'avoir expliqué ce qui se passe!
Richard

4

Au lieu de

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

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


3

Ajouter

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

sur Android.mk


2
Pourquoi? Veuillez expliquer pourquoi cette réponse devrait fonctionner pour le demandeur.
L0j1k

1

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)

0

Dans la version 2.2 et supérieure du studio Android, il existe une prise en charge intégrée de CPP lorsque vous créez un nouveau projet. De plus, le liblog.so est inclus par défaut. Rien à faire à part 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. Ça devrait être:

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

Dans mon cas, j'avais omis le paramètre de balise et j'ai fini par passer 3 bons jours à le comprendre.

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



0

ajouter LOCAL_SHARED_LIBRARIES:= liblog à Android.mk peut résoudre mon problème. C'est parce que le __android_log_printest défini dans libLog


0

Pour construire avec Android.bp, suivez la solution ci-dessous:

Dans ce - android_log_print est défini dans NDK, donc pour cela, il existe déjà une bibliothèque est disponible. Utilisez la bibliothèque " liblog " en utilisant la balise shared_libs , prenez référence au code ci-dessous:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.