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"
}
}
}