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'
alex2k8
la source

Réponses:

89

Essayez ce qui suit dans votre Android.mkfichier:

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

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

Lewkka
la source
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'])
}
DroidlikeCode
la source
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.

mk ..
la source
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).

DNax
la source
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.

SudoSURoot
la source
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

sethbabs
la source
3

Ajouter

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

sur Android.mk

user3535040
la source
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)
NickUnuchek
la source
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

Praveen Kumar KR
la source
0

-DCMAKE_CXX_FLAGS = "- llog" m'aide

James
la source
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

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