¿Qué pasa con mi archivo 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'
ldLibs = ["android", "log"]
a sus opciones android.ndkNecesitas agregar
a Android.mk
fuente
Si usa Android Studio y gradle, ignora Android.mk. Agregue esto a su archivo build.gradle:
fuente
ldLibs
. Gracias.ndk
parte en build.gradle dentro de laapp
carpeta en lugar de la que está en la carpeta del proyecto (nombre del módulo).ldLibs.addAll(["android", "log"])
Para Android Studio 2.2 y tools.build:gradle:2.2.0 usando CMake, agregue o edite la fila en CMakeLists.txt:
Eso conecta la biblioteca de registros con la tuya.
fuente
Si actualiza a Android Studio 2.1, las respuestas anteriores no funcionan, necesita usar ldLibs.add () para cargar la biblioteca de la siguiente manera:
fuente
Podemos vincular una biblioteca compartida en Android de 3 formas. En los siguientes 3 casos, las líneas mencionadas deben agregarse en
Android.mk
Así que aquí están las tres formas.
Por alguna razón, si 1 no funciona (no funcionó para mí), puede probar a continuación 2 formas
Por supuesto, también debe incluirlo
#include <android/log.h>
en su archivo C / H.fuente
En caso de que el proyecto en el que está trabajando tenga las siguientes características que difieran de otras respuestas 'estándar':
El siguiente uso de target_link_libraries lo hace:
Siendo
TARGET_NAME
el nombre del objetivo a construir (habiéndolo configurado antes conadd_library
oadd_executable
).find_library
es igualmente importante, además de configurar correctamente la cadena de herramientas (use la cadena de herramientas proporcionada por Android SDK enANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake
para configurarCMAKE_SYSROOT
cuál es utilizada por losfind_
comandos).fuente
Sí, debe agregar:
LOCAL_LDLIBS := -llog
como se especificaron las otras respuestas / comentarios, sin embargo, la pregunta original no especificaba si usaba la biblioteca jni como:LOCAL_JNI_SHARED_LIBRARIES
o comoLOCAL_REQUIRED_MODULES
.Puedo decir con certeza que lo ha usado como:
LOCAL_REQUIRED_MODULES
debido alLOCAL_EXPORT_LDLIBS := -llog
en la pregunta ... a menos que se haya agregado después de una edición.Si usa
LOCAL_REQUIRED_MODULES
la biblioteca compartida, se instala en / system / lib en lugar de en el apk, porque es un módulo obligatorio. Por lo tanto, necesitará agregar enLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
lugar de soloLOCAL_LDLIBS := -llog
para que cuando el sistema de compilación esté construyendo y vinculando la biblioteca compartida jni, tenga las-llog
definiciones en el lugar correcto, disponibles para construir$OUT/root/system/lib
. De lo contrario, seguirá obteniendo la misma respuesta, incluso si solo agregaLOCAL_LDLIBS := -llog
.Entonces, aquellos que comentaron que
-L
no es necesario, y la otra respuesta fue correcta, en realidad fueron incorrectos en esta situación.fuente
En lugar de
utilizar
ldLibs.addAll(["android", "log"])
para el complemento experimentalfuente
Añadir
a Android.mk
fuente
Esto me ayudó:
Android.mk
fuente
En la versión 2.2 y superior de Android Studio, hay soporte incorporado para CPP cuando crea un nuevo proyecto. Además, liblog.so se incluye de forma predeterminada. No se puede hacer nada aparte de incluir el archivo de encabezado (android / log.h).
Checkout app / CMakeLists.txt que crea el estudio cuando creamos un nuevo proyecto de estudio de Android. Podemos ver que el bloque find_library () y el bloque target_link_libraries () para loglib ya están presentes.
Además, preste atención a la sintaxis de la función. Debería ser:
En mi caso, había omitido el parámetro de etiqueta y terminé gastando buenos 3 días en resolverlo.
Más sobre CMake: agregue código C y C ++ a su proyecto
fuente
-DCMAKE_CXX_FLAGS = "- llog" me ayuda
fuente
agregar
LOCAL_SHARED_LIBRARIES:= liblog
a Android.mk puede resolver mi problema. Esto se debe a que__android_log_print
está definido en libLogfuente
PARA construir con Android.bp, siga la siguiente solución:
En esto, android_log_print está definido en NDK, por lo que para esto, ya hay una biblioteca disponible. Use la biblioteca " liblog " usando la etiqueta shared_libs , tome referencia al siguiente código:
fuente