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'
ldLibs = ["android", "log"]
à vos options android.ndkVous devez ajouter
sur Android.mk
la source
Si vous utilisez Android Studio et gradle, il ignore Android.mk. Ajoutez ceci à votre fichier build.gradle:
la source
ldLibs
. Merci.ndk
partie dans le build.gradle dans leapp
dossier au lieu de celle du dossier du projet (nom du module).ldLibs.addAll(["android", "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:
C'est la connexion de la bibliothèque de journaux à la vôtre.
la source
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:
la source
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 dans
Android.mk
Voici donc les trois façons.
Pour une raison quelconque, si 1 ne fonctionne pas (cela n'a pas fonctionné pour moi), vous pouvez essayer ci-dessous 2 façons
Bien sûr, vous devez également inclure
#include <android/log.h>
dans votre fichier C / H.la source
Dans le cas où le projet sur lequel vous travaillez présente les caractéristiques suivantes qui diffèrent des autres réponses `` standard '':
L' utilisation suivante de target_link_libraries en fait:
Être
TARGET_NAME
le nom de la cible à construire (après l'avoir configuré avecadd_library
ouadd_executable
).find_library
est tout aussi important que de configurer correctement la chaîne d'outils (utilisez la chaîne d'outils fournie par Android SDKANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake
pour qu'elle configure ceCMAKE_SYSROOT
qui est utilisé par lesfind_
commandes).la source
Oui, vous devez ajouter:
LOCAL_LDLIBS := -llog
comme 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_LIBRARIES
ou commeLOCAL_REQUIRED_MODULES
.Je peux à peu près dire avec certitude qu'il l'a utilisé comme: à
LOCAL_REQUIRED_MODULES
cause deLOCAL_EXPORT_LDLIBS := -llog
la question ... à moins que cela n'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 il s'agit d'un module obligatoire. Par conséquent, vous devrez ajouterLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
au lieu de justeLOCAL_LDLIBS := -llog
pour que lorsque le système de construction construit et lie la bibliothèque partagée jni, il ait les-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 queLOCAL_LDLIBS := -llog
.Donc, ceux qui ont fait remarquer que le
-L
n'est pas nécessaire, et l'autre réponse était correcte, ils étaient en fait inexacts dans cette situation.la source
Au lieu de
utiliser
ldLibs.addAll(["android", "log"])
pour le plugin expérimentalla source
Ajouter
sur Android.mk
la source
Cela m'a aidé:
Android.mk
la source
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:
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
la source
-DCMAKE_CXX_FLAGS = "- llog" m'aide
la source
ajouter
LOCAL_SHARED_LIBRARIES:= liblog
à Android.mk peut résoudre mon problème. C'est parce que le__android_log_print
est défini dans libLogla source
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:
la source