web-dev-qa-db-fra.com

référence non définie à "__Android_log_print"

Quel est le problème avec mon fichier make?

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

Essayez ce qui suit dans votre fichier Android.mk:

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

Vous devez ajouter

LOCAL_LDLIBS := -llog

à Android.mk

92
Kyle

Si vous utilisez Android Studio et Gradle, Android.mk est ignoré. Ajoutez ceci à votre fichier build.gradle:

Android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}
83
BoredT

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 reliant la bibliothèque de journaux à la vôtre.

29
lewkka

Si vous passez à Android Studio 2.1, les réponses ci-dessus ne fonctionnent pas, utilisez ldLibs.add () pour charger la bibliothèque comme suit:

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

Nous pouvons relier une bibliothèque partagée sous Android de 3 manières . Dans les 3 cas suivants, 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 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
mk..

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 

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

4
sethbabs

Si le projet sur lequel vous travaillez a 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é pour la construction
  • Utiliser CMake et la chaîne d’outils directement (votre projet est peut-être basé sur Qt et sans utiliser QtCreator)

Le target_link_libraries usage le rend:

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

Étant TARGET_NAMEle nom de la cible à construire (l'avoir préalablement 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 à l'adresse Android_SDK_HOME/cmake/<version>/Android.toolchain.cmake pour configurer CMAKE_SYSROOT utilisé par les commandes find_).

3
DNax

Ajouter 

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

à Android.mk

3
user3535040

Oui, vous devez ajouter: LOCAL_LDLIBS := -llog comme indiqué dans les autres réponses/commentaires, mais la question d'origine ne précisait pas s'il utilisait la bibliothèque jni comme suit: LOCAL_JNI_SHARED_LIBRARIES ou LOCAL_REQUIRED_MODULES

Je peux dire avec certitude qu'il l'a utilisé comme suit: LOCAL_REQUIRED_MODULES en raison du LOCAL_EXPORT_LDLIBS := -llog dans la question ... sauf si cela a é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 il s'agit d'un module requis. Par conséquent, vous devrez ajouter LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog au lieu de LOCAL_LDLIBS := -llog pour que, lorsque le système de construction crée et relie la bibliothèque partagée jni, les définitions -llog soient placées au bon endroit et peuvent ê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.

Ainsi, ceux qui ont commenté que le -L n'était pas nécessaire, et que l'autre réponse était correcte, ils étaient en fait incorrects dans cette situation.

3
SudoSURoot

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)
1
NickUnuchek

Dans les versions 2.2 et supérieures d'Android Studio, la prise en charge de CPP est intégrée lorsque vous créez un nouveau projet. De plus, le liblog.so est inclus par défaut. Rien à faire à part l'inclusion du fichier d'en-tête (Android/log.h).

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

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

__Android_log_print (priorité int, balise const char *, const char * fmt, ...);

Dans mon cas, j’avais oublié le paramètre de la balise et ai passé 3 bons jours à le comprendre.

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

0
Praveen Kumar KR