usar r13 para ndk instalar how como android jni logging android-ndk

r13 - referencia indefinida a `__android_log_print ''



ndk 15 (12)

¿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''


Añadir

LOCAL_SHARED_LIBRARIES:= / libbinder / liblog /

a Android.mk


En caso de que el proyecto en el que está trabajando tenga las siguientes características que difieren de otras respuestas ''estándar'':

  • No usando Android Studio
  • Sin usar gradle y el CMake integrado
  • No se usaron Android.mk o Application.mk para construir
  • Usar CMake y la cadena de herramientas directamente (tal vez su proyecto esté basado en Qt y sin usar QtCreator tampoco)

El siguiente uso de target_link_libraries hace:

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

Siendo TARGET_NAME el nombre del objetivo para compilar (configurándolo antes con add_library o add_executable ).

find_library es igualmente importante, así como configurar correctamente la cadena de herramientas (use la cadena de herramientas proporcionada por Android SDK en ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake para que configure CMAKE_SYSROOT que es usado por los comandos find_ ).


En el estudio android versión 2.2 y superior, hay soporte integrado para CPP cuando crea un nuevo proyecto. Además, liblog.so está incluido por defecto. No hay nada que hacer aparte de incluir el archivo de encabezado (android / log.h).

Checkout app / CMakeLists.txt creada por el estudio cuando creamos un nuevo proyecto de estudio de Android. Podemos ver que el bloque find_library () block y target_link_libraries () para loglib ya están presentes.

Además, preste atención a la sintaxis de la función. Debería ser:

__android_log_print (prioridad int, etiqueta const char *, const char * fmt, ...);

En mi caso, había omitido el parámetro de etiqueta y terminé pasando buenos 3 días para descubrirlo.

Más sobre CMake: agregue código C y C ++ a su proyecto


En lugar de

Si utiliza la nueva integración de Gradle NDK en Android Studio 1.3, debe agregar ldLibs = ["android", "log"] a sus opciones de android.ndk - Stephen Kaiser, 24 de septiembre a las 4:20

use ldLibs.addAll(["android", "log"]) para el plugin experimental


Esto me ayudó:

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)


Necesitas agregar

LOCAL_LDLIBS := -llog

a Android.mk


Para Android Studio 2.2 y tools.build:gradle:2.2.0 usando CMake add or edit row en CMakeLists.txt:

target_link_libraries(<your_library_name> android log)

Eso es conectar la biblioteca de registro a la tuya.


Podemos vincular una biblioteca compartida en Android de 3 maneras. En menos de 3 casos, las líneas mencionadas deberían agregarse en Android.mk

Entonces estas son las tres formas.

1. LOCAL_LDLIBS way LOCAL_LDLIBS := -llog

Por alguna razón, si 1 no funciona (no funcionó), puedes probar a continuación 2 formas

2. LOCAL_LDFLAGS way LOCAL_LDFLAGS := -llog 3. LOCAL_SHARED_LIBRARIES way LOCAL_SHARED_LIBRARIES += liblog

Por supuesto, también necesita incluir #include <android/log.h> en su archivo C / H.


Pruebe lo siguiente en su archivo Android.mk :

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


Sí, necesita agregar: LOCAL_LDLIBS := -llog como las otras respuestas / comentarios han especificado, sin embargo, la pregunta original no especificó si usa la biblioteca jni como: LOCAL_JNI_SHARED_LIBRARIES o como LOCAL_REQUIRED_MODULES .

LOCAL_REQUIRED_MODULES puedo decir con certeza que lo tiene como: LOCAL_REQUIRED_MODULES debido a LOCAL_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 la apk, porque es un módulo obligatorio. Por lo tanto, necesitará agregar LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog lugar de solo LOCAL_LDLIBS := -llog para que cuando el sistema de compilación esté compilando y enlazando la biblioteca jni compartida, tenga el -llog definiciones en el lugar correcto, disponible para ser construido bajo $OUT/root/system/lib . De lo contrario, continuará recibiendo la misma respuesta, incluso si solo agrega LOCAL_LDLIBS := -llog .

Entonces, aquellos que comentaron que la -L no es necesaria, y la otra respuesta fue correcta, en realidad fueron incorrectos en esta situación.


Si actualiza a Android Studio 2.1, las respuestas anteriores no funcionan, necesita usar ldLibs.add () para cargar la lib de la siguiente manera:

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


Si usa Android Studio y gradle, ignora Android.mk. Agregue esto a su archivo build.gradle:

android { defaultConfig { ndk { moduleName "your_module_name" ldLibs "log" } } }