riferimento non definito a "__android_log_print"


100

Cosa c'è di sbagliato nel mio file 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'

Risposte:


89

Prova quanto segue nel tuo Android.mkfile:

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

1
Qual è il necessario per aggiungere questo? Potresti spiegare in dettaglio?
Dhasneem

sta aggiungendo una libreria Android al file make - e ha funzionato anche per me
gheese

9
la -L non è necessaria. Accetta invece l'altra risposta.
Jeff Allen

5
Se si utilizza la nuova integrazione Gradle NDK in Android Studio 1.3, è necessario aggiungere ldLibs = ["android", "log"]alle opzioni android.ndk
Stephen Kaiser

1
E se non usassimo Android.mk?
cagdas

99

Devi aggiungere

LOCAL_LDLIBS := -llog

ad Android.mk


1
corretta. se sono presenti più librerie, è necessario aggiungere questa istruzione per ciascuna di esse (dopo CLEAR VARS)
user13107

86

Se usi Android Studio e gradle, ignora Android.mk. Aggiungilo al tuo file build.gradle:

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

7
Mi chiedo dove sia documentato. Stavo cercando anche questo.
Randy Sugianto 'Yuku'

1
Ricevo "riferimento indefinito a '__android_log_print'" prima di aggiungere ldLibs. Grazie.
Denis Kniazhev

2
L'aggiunta di questo ha risolto il problema per me. Assicurati solo di aggiungere la ndkparte nel build.gradle all'interno della appcartella invece di quella nella cartella del progetto (nome del modulo).
Mathiass

A partire da Gradle 2.5, usa 'ldLibs + = "log"' leggero cambiamento di sintassi
Lorne K

15
questo NON ha funzionato per me. questo è quello che dovevo fare:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ

29

Per Android Studio 2.2 e tools.build:gradle:2.2.0 utilizzando CMake aggiungi o modifica riga in CMakeLists.txt:

target_link_libraries(<your_library_name> 
                      android 
                      log)

Questo è il collegamento della libreria di log alla tua.


16

Se esegui l'aggiornamento ad Android Studio 2.1, le risposte precedenti non funzionano, devi usare ldLibs.add () per caricare la libreria come di seguito:

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

migliore risposta moderna (fine 2017)
Edgar Aroutiounian

7

Possiamo collegare una libreria condivisa in Android in 3 modi. In meno di 3 casi, le linee menzionate dovrebbero essere aggiunteAndroid.mk

Quindi ecco i tre modi.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Per qualche motivo se 1 non funziona (non ha funzionato per me), puoi provare i seguenti 2 modi

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

Ovviamente è necessario includere anche #include <android/log.h> nel file C / H.


6

Nel caso in cui il progetto su cui stai lavorando abbia le seguenti caratteristiche che differiscono da altre risposte 'standard':

  • Non si utilizza Android Studio
  • Non si utilizza Gradle e CMake integrato
  • Nessun Android.mk o Application.mk utilizzato affatto per la build
  • Usando direttamente CMake e la toolchain (forse il tuo progetto è basato su Qt e senza usare nemmeno QtCreator)

Il seguente utilizzo di target_link_libraries lo rende:

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

Essere TARGET_NAMEil nome del target da costruire (dopo averlo impostato prima con add_libraryo add_executable).

find_libraryè altrettanto importante così come impostare correttamente la toolchain (usa la toolchain fornita da Android SDK in ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakemodo da impostare quella CMAKE_SYSROOTutilizzata dai find_comandi).


L'unica soluzione che mi ha aiutato! Grazie una tonnellata, vorrei estendere da un test se la libreria è stato trovato per migliorare il feedback allo sviluppatore come qui stackoverflow.com/a/37868829/10030695
ManuelTS

4

Sì, è necessario aggiungere: LOCAL_LDLIBS := -llogcome hanno specificato le altre risposte / commenti, tuttavia la domanda originale non specificava se utilizzava la libreria jni come: LOCAL_JNI_SHARED_LIBRARIESo come LOCAL_REQUIRED_MODULES.

Posso praticamente dire con certezza che l'ha usato come: a LOCAL_REQUIRED_MODULEScausa del LOCAL_EXPORT_LDLIBS := -llognella domanda ... a meno che non sia stato aggiunto dopo una modifica.

Se usi LOCAL_REQUIRED_MODULESla libreria condivisa viene installata in / system / lib invece che nell'apk, perché è un modulo obbligatorio. Pertanto sarà necessario aggiungere LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lloganziché solo in LOCAL_LDLIBS := -llogmodo che quando il sistema di compilazione sta costruendo e collegando la libreria condivisa jni, avrà le -llogdefinizioni nel posto corretto, disponibile per essere compilato $OUT/root/system/lib. Altrimenti continuerai a ottenere la stessa risposta, anche se aggiungi solo LOCAL_LDLIBS := -llog.

Quindi, coloro che hanno commentato che -Lnon è necessario e l'altra risposta era corretta, in realtà erano errati in questa situazione.


Grazie per aver effettivamente spiegato cosa sta succedendo!
Richard

4

Al posto di

Se utilizzi la nuova integrazione Gradle NDK in Android Studio 1.3, devi aggiungere ldLibs = ["android", "log"] alle tue opzioni android.ndk - Stephen Kaiser 24 settembre alle 4:20

utilizzare ldLibs.addAll(["android", "log"])per il plugin sperimentale


3

Inserisci

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

ad Android.mk


2
Perché? Spiega perché questa risposta dovrebbe funzionare per il richiedente.
L0j1k

1

Questo mi ha aiutato:

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)

0

Nella versione 2.2 e successive di Android Studio, c'è il supporto integrato per CPP quando crei un nuovo progetto. Inoltre, liblog.so è incluso di default. Niente da fare oltre a includere il file di intestazione (android / log.h).

Checkout app / CMakeLists.txt che viene creato dallo studio quando creiamo un nuovo progetto di studio Android. Possiamo vedere che il blocco find_library () e il blocco target_link_libraries () per loglib sono già presenti.

Inoltre, prestare attenzione alla sintassi della funzione. Dovrebbe essere:

__android_log_print (int priorità, const char * tag, const char * fmt, ...);

Nel mio caso, avevo omesso il parametro del tag e ho finito per passare 3 giorni buoni a capirlo.

Ulteriori informazioni su CMake: aggiungi codice C e C ++ al tuo progetto



0

aggiungere LOCAL_SHARED_LIBRARIES:= liblog ad Android.mk può risolvere il mio isuue. Questo perché __android_log_printè definito in libLog


0

PER creare con Android.bp, segui la soluzione seguente:

In questo - android_log_print è definito in NDK, quindi per questo è già disponibile una libreria. Usa la libreria " liblog " utilizzando il tag shared_libs , fai riferimento al codice seguente:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.