referencia indefinida a `__android_log_print '

100

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

Respuestas:

89

Intente lo siguiente en su Android.mkarchivo:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
Ryan Reeves
fuente
1
¿Qué es lo necesario para agregar esto? ¿Podría explicarlo en detalle?
Dhasneem
está agregando una biblioteca de Android al archivo make, y también funcionó para mí
gheese
9
la -L es innecesaria. Acepte la otra respuesta en su lugar.
Jeff Allen
5
Si usa la nueva integración de Gradle NDK en Android Studio 1.3, debe agregar ldLibs = ["android", "log"]a sus opciones android.ndk
Stephen Kaiser
1
¿Qué pasa si no estamos usando Android.mk's?
cagdas
99

Necesitas agregar

LOCAL_LDLIBS := -llog

a Android.mk

Kyle
fuente
1
correcto. si hay varias bibliotecas, es necesario agregar esta declaración para cada una de ellas (después de CLEAR VARS)
user13107
86

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"
        }
    }
}
Aburrido
fuente
7
Me pregunto dónde está documentado esto. Yo también estaba buscando esto.
Randy Sugianto 'Yuku'
1
Estaba obteniendo "referencia indefinida a '__android_log_print'" antes de agregar ldLibs. Gracias.
Denis Kniazhev
2
Agregar esto lo arregló para mí. Solo asegúrese de agregar la ndkparte en build.gradle dentro de la appcarpeta en lugar de la que está en la carpeta del proyecto (nombre del módulo).
Mathiass
A partir de Gradle 2.5 use 'ldLibs + = "log"' ligero cambio de sintaxis
Lorne K
15
Esto no funcionó para mí. esto es lo que tuve que hacer:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ
29

Para Android Studio 2.2 y tools.build:gradle:2.2.0 usando CMake, agregue o edite la fila en CMakeLists.txt:

target_link_libraries(<your_library_name> 
                      android 
                      log)

Eso conecta la biblioteca de registros con la tuya.

lewkka
fuente
16

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

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}
DroidlikeCode
fuente
mejor respuesta moderna (finales de 2017)
Edgar Aroutiounian
7

Podemos vincular una biblioteca compartida en Android de 3 formas. En los siguientes 3 casos, las líneas mencionadas deben agregarse enAndroid.mk

Así que aquí están las tres formas.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Por alguna razón, si 1 no funciona (no funcionó para mí), puede 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 debe incluirlo #include <android/log.h> en su archivo C / H.

mk ..
fuente
6

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

  • Sin usar Android Studio
  • No usar gradle y el CMake integrado
  • No se utilizó Android.mk o Application.mk para la compilación
  • Usando 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 lo hace:

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

Siendo TARGET_NAMEel nombre del objetivo a construir (habiéndolo configurado antes con add_libraryo add_executable).

find_libraryes igualmente importante, además de configurar correctamente la cadena de herramientas (use la cadena de herramientas proporcionada por Android SDK en ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakepara configurar CMAKE_SYSROOTcuál es utilizada por los find_comandos).

DNax
fuente
¡La única solución que me ayudó! Muchas gracias, lo ampliaría con una prueba si se encontrara la biblioteca para obtener mejores comentarios para el desarrollador, como aquí stackoverflow.com/a/37868829/10030695
ManuelTS
4

Sí, debe agregar: LOCAL_LDLIBS := -llogcomo se especificaron las otras respuestas / comentarios, sin embargo, la pregunta original no especificaba si usaba la biblioteca jni como: LOCAL_JNI_SHARED_LIBRARIESo como LOCAL_REQUIRED_MODULES.

Puedo decir con certeza que lo ha usado como: LOCAL_REQUIRED_MODULESdebido al LOCAL_EXPORT_LDLIBS := -llogen la pregunta ... a menos que se haya agregado después de una edición.

Si usa LOCAL_REQUIRED_MODULESla biblioteca compartida, se instala en / system / lib en lugar de en el apk, porque es un módulo obligatorio. Por lo tanto, necesitará agregar en LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lloglugar de solo LOCAL_LDLIBS := -llogpara que cuando el sistema de compilación esté construyendo y vinculando la biblioteca compartida jni, tenga las -llogdefiniciones en el lugar correcto, disponibles para construir $OUT/root/system/lib. De lo contrario, seguirá obteniendo la misma respuesta, incluso si solo agrega LOCAL_LDLIBS := -llog.

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

SudoSURoot
fuente
¡Gracias por explicar realmente lo que está pasando!
Richard
4

En lugar de

Si usa 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

utilizar ldLibs.addAll(["android", "log"])para el complemento experimental

sethbabs
fuente
3

Añadir

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

a Android.mk

usuario3535040
fuente
2
¿Por qué? Explique por qué esta respuesta debería funcionar para el autor de la pregunta.
L0j1k
1

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)
NickUnuchek
fuente
0

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:

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

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

Praveen Kumar KR
fuente
0

-DCMAKE_CXX_FLAGS = "- llog" me ayuda

James
fuente
0

agregar LOCAL_SHARED_LIBRARIES:= liblog a Android.mk puede resolver mi problema. Esto se debe a que __android_log_printestá definido en libLog

nld2019
fuente
0

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:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
Budhdi Sharma
fuente