niezdefiniowane odniesienie do `__android_log_print '

100

Co jest nie tak z moim plikiem 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
źródło

Odpowiedzi:

89

Spróbuj wykonać następujące czynności w swoim Android.mkpliku:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
Ryan Reeves
źródło
1
Co jest potrzebne, aby to dodać? Czy mógłbyś szczegółowo wyjaśnić?
Dhasneem
to dodanie biblioteki androida do pliku make - i dla mnie też
zadziałało
9
-L jest niepotrzebne. Zamiast tego zaakceptuj inną odpowiedź.
Jeff Allen,
5
Jeśli korzystasz z nowej integracji Gradle NDK w Android Studio 1.3, musisz dodać ldLibs = ["android", "log"]do swojego android.ndk opcje
Stephen Kaiser
1
A co, jeśli nie używamy Android.mk?
cagdas
99

Musisz dodać

LOCAL_LDLIBS := -llog

do Android.mk

Kyle
źródło
1
poprawny. jeśli istnieje wiele bibliotek, należy dodać tę instrukcję dla każdej z nich (po CLEAR VARS)
user13107
86

Jeśli używasz Android Studio i Gradle, ignoruje on Android.mk. Dodaj to do swojego pliku build.gradle:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}
Znudzony T.
źródło
7
Zastanawiam się, gdzie to jest udokumentowane. Tego też szukałem.
Randy Sugianto „Yuku”
1
Otrzymałem „niezdefiniowane odniesienie do '__android_log_print'”, zanim dodałem ldLibs. Dzięki.
Denis Kniazhev
2
Dodanie tego rozwiązało problem. Po prostu upewnij się, że ndkczęść w pliku build.gradle znajduje się w appfolderze, a nie w folderze projektu (nazwa modułu).
mathiass
Od Gradle 2.5 użyj 'ldLibs + = "log"' niewielka zmiana składni
Lorne K
15
to NIE zadziałało dla mnie. oto co musiałem zrobić:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ
29

W przypadku Android Studio 2.2 i tools.build:gradle:2.2.0 przy użyciu CMake dodaj lub edytuj wiersz w CMakeLists.txt:

target_link_libraries(<your_library_name> 
                      android 
                      log)

To łączy bibliotekę dzienników z Twoją.

lewkka
źródło
16

W przypadku aktualizacji do Android Studio 2.1 powyższe odpowiedzi nie działają, należy użyć ldLibs.add (), aby załadować bibliotekę, jak poniżej:

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}
DroidlikeCode
źródło
najlepsza nowoczesna odpowiedź (koniec 2017 r.)
Edgar Aroutiounian
7

Możemy połączyć udostępnioną bibliotekę w systemie Android na 3 sposoby. W poniższych 3 przypadkach wspomniane wiersze należy dodać wAndroid.mk

Oto trzy sposoby.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Z jakiegoś powodu, jeśli 1 nie działa (nie działa dla mnie), możesz wypróbować poniżej 2 sposoby

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

Oczywiście musisz również dołączyć do #include <android/log.h> pliku C / H.

mk ..
źródło
6

W przypadku, gdy projekt, nad którym pracujesz, ma następujące cechy, które różnią się od innych `` standardowych '' odpowiedzi:

  • Nie korzystam z Android Studio
  • Nie używam gradle i zintegrowanego CMake
  • Żadne Android.mk ani Application.mk nie są w ogóle używane do kompilacji
  • Używanie CMake i toolchaina bezpośrednio (być może twój projekt jest oparty na Qt i nie używa QtCreator)

Sprawia to następujące użycie target_link_libraries :

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

Jest TARGET_NAMEnazwą celu do zbudowania (po skonfigurowaniu go wcześniej za pomocą add_librarylub add_executable).

find_libraryjest równie ważny, jak prawidłowe skonfigurowanie łańcucha narzędzi (użyj łańcucha narzędzi dostarczonego przez Android SDK, ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakeaby skonfigurować, CMAKE_SYSROOTktóry jest używany przez find_polecenia).

DNax
źródło
Jedyne rozwiązanie, które mi pomogło!
Wielkie
4

Tak, musisz dodać: LOCAL_LDLIBS := -llogjak wskazały inne odpowiedzi / komentarze, jednak pierwotne pytanie nie określało, czy używa biblioteki jni jako: LOCAL_JNI_SHARED_LIBRARIESczy jako LOCAL_REQUIRED_MODULES.

Z całą pewnością mogę powiedzieć, że użył go jako: LOCAL_REQUIRED_MODULESze względu LOCAL_EXPORT_LDLIBS := -llogna pytanie ... chyba, że ​​zostało dodane po edycji.

Jeśli korzystasz LOCAL_REQUIRED_MODULESz biblioteki współdzielonej, jest ona instalowana w / system / lib zamiast w apk, ponieważ jest to wymagany moduł. Dlatego będziesz musiał dodać LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llogzamiast tylko po LOCAL_LDLIBS := -llogto, aby system kompilacji budował i łączył współdzieloną bibliotekę jni, miał -llogdefinicje we właściwym miejscu, w którym można je zbudować $OUT/root/system/lib. W przeciwnym razie nadal będziesz otrzymywać tę samą odpowiedź, nawet jeśli tylko dodasz LOCAL_LDLIBS := -llog.

Tak więc ci, którzy komentowali, że -Lnie jest potrzebny, a druga odpowiedź była poprawna, w rzeczywistości byli w tej sytuacji błędni.

SudoSURoot
źródło
Dziękuję za wyjaśnienie, co się dzieje!
Richard,
4

Zamiast

Jeśli korzystasz z nowej integracji Gradle NDK w Android Studio 1.3, musisz dodać ldLibs = ["android", "log"] do opcji android.ndk - Stephen Kaiser 24 września o 4:20

używać ldLibs.addAll(["android", "log"])dla eksperymentalnej wtyczki

sethbabs
źródło
3

Dodaj

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

do Android.mk

user3535040
źródło
2
Czemu? Proszę wyjaśnić, dlaczego ta odpowiedź powinna działać dla pytającego.
L0j1k
1

Pomogło mi to:

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
źródło
0

W Android Studio w wersji 2.2 i nowszych istnieje wbudowana obsługa CPP podczas tworzenia nowego projektu. Domyślnie dołączony jest również plik liblog.so. Nie można nic zrobić poza dołączeniem pliku nagłówkowego (android / log.h).

Aplikacja Checkout / CMakeLists.txt, która jest tworzona przez studio podczas tworzenia nowego projektu Android Studio. Widzimy, że bloki find_library () i target_link_libraries () dla loglib są już obecne.

Zwróć także uwagę na składnię funkcji. Powinno być:

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

W moim przypadku pominąłem parametr tagu i spędziłem dobre 3 dni na jego ustaleniu.

Więcej informacji o CMake: Dodaj kod C i C ++ do swojego projektu

Praveen Kumar KR
źródło
0

-DCMAKE_CXX_FLAGS = "- llog" mi pomaga

James
źródło
0

dodaj LOCAL_SHARED_LIBRARIES:= liblog do Android.mk może rozwiązać mój problem. Dzieje się tak, ponieważ __android_log_printjest on zdefiniowany w libLog

nld2019
źródło
0

Aby zbudować z Android.bp, postępuj zgodnie z poniższym rozwiązaniem:

W tym - android_log_print jest zdefiniowany w NDK, więc do tego jest już dostępna biblioteka. Użyj biblioteki „ liblog ” za pomocą tagu shared_libs , skorzystaj z odniesienia do poniższego kodu:

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