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'
Essayez ce qui suit dans votre fichier Android.mk
:
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
Vous devez ajouter
LOCAL_LDLIBS := -llog
à Android.mk
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"
}
}
}
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.
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'])
}
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.
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
Si le projet sur lequel vous travaillez a les caractéristiques suivantes qui diffèrent des autres réponses «standard»:
Le target_link_libraries usage le rend:
find_library(Android_LOG_LIB log)
target_link_libraries(${TARGET_NAME} ${Android_LOG_LIB})
Étant TARGET_NAME
le 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_
).
Ajouter
LOCAL_SHARED_LIBRARIES:= \
libbinder \
liblog \
à Android.mk
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.
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)
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