undefined reference to 'android log print'

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'
Author: alex2k8, 2010-12-15

15 answers

Spróbuj w pliku Android.mk:

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
 90
Author: Ryan Reeves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-04 12:57:25

Musisz dodać

LOCAL_LDLIBS := -llog

To Android.mk

 100
Author: Kyle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-31 05:46:33

Jeśli używasz Android Studio i gradle, ignoruje Android.mk dodaj to do swojej budowy.plik gradle:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}
 86
Author: BoredT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-10 17:41:47

Dla Android Studio 2.2 i narzędzi.Budowa: gradle: 2.2.0 using CMake Dodaj lub edytuj wiersz w CMakeLists.txt:

target_link_libraries(<your_library_name> 
                      android 
                      log)

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

 29
Author: lewkka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-09 17:22:08

Jeśli uaktualnić do Android Studio 2.1, powyższe odpowiedzi nie działają, trzeba użyć ldLibs.Dodaj (), aby załadować lib jak poniżej:

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}
 16
Author: DroidlikeCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-05 16:49:13

Możemy połączyć dzieloną bibliotekę w Androidzie na 3 sposoby. W poniższych 3 przypadkach wymienione wiersze należy dodać w Android.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 spró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ć #include <android/log.h> do pliku C/h.

 7
Author: mk..,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 06:16:23

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

  • nie używam Android Studio
  • nie używaj gradle 'a i zintegrowanego CMake' a
  • nie Android.mk lub Application.mk używane w ogóle do budowy
  • Korzystanie bezpośrednio z CMake i toolchaina (być może twój projekt jest oparty na Qt i nie używa Qtcreatora)

Następujące target_link_libraries użycie sprawia, że it:

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

Jest TARGET_NAME nazwą celu do zbudowania (po skonfigurowaniu go wcześniej z add_library lub add_executable).

find_library jest równie ważne, jak prawidłowe skonfigurowanie toolchain (użyj toolchain dostarczonego przez Android SDK w ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake, aby ustawić CMAKE_SYSROOT, który jest używany przez find_ poleceń).

 7
Author: DNax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-14 00:05:30

Tak, musisz dodać: LOCAL_LDLIBS := -llog tak jak inne odpowiedzi/komentarze zostały określone, jednak oryginalne pytanie nie określiło, czy używa biblioteki jni jako: LOCAL_JNI_SHARED_LIBRARIES czy jako LOCAL_REQUIRED_MODULES.

Mogę powiedzieć na pewno, że użył go jako: LOCAL_REQUIRED_MODULES ze względu na LOCAL_EXPORT_LDLIBS := -llog w pytaniu... chyba, że zostało dodane po edycji.

Jeśli używasz LOCAL_REQUIRED_MODULES biblioteka współdzielona jest zainstalowana w /system/lib zamiast w apk, ponieważ jest to wymagany moduł. Dlatego będziesz musiał dodaj LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog zamiast tylko LOCAL_LDLIBS := -llog, Aby gdy system budowania buduje i łączy bibliotekę współdzieloną jni, będzie miał definicje -llog we właściwym miejscu, dostępne do zbudowania pod $OUT/root/system/lib. W przeciwnym razie otrzymasz tę samą odpowiedź, nawet jeśli dodasz tylko LOCAL_LDLIBS := -llog.

Więc ci, którzy skomentowali, że -L nie jest potrzebny, a druga odpowiedź była poprawna, byli rzeczywiście niepoprawni w tej sytuacji.

 4
Author: SudoSURoot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-05 21:17:15

W miejsce

Jeśli używasz nowej integracji Gradle NDK w Android Studio 1.3, musisz dodać ldLibs = ["android"," log"] do swojego Androida.opcje ndk-Stephen Kaiser Sep 24 at 4:20

Użyj ldLibs.addAll(["android", "log"]) dla eksperymentalnej Wtyczki

 4
Author: sethbabs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-27 01:40:00

Dodaj

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

To Android.mk

 3
Author: user3535040,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 08:24:14

To mi pomogło:

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)
 1
Author: NickUnuchek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 12:12:48

W android studio w wersji 2.2 i wyższej, istnieje wbudowane wsparcie dla CPP podczas tworzenia nowego projektu. Ponadto, liblog.so jest domyślnie dołączony. Nic nie można zrobić poza włączeniem pliku nagłówkowego (android / log.h).

Checkout app / CMakeLists.txt, który jest tworzony przez studio, gdy tworzymy nowy projekt Android studio. Widzimy, że blok find_library() i target_link_libraries () dla loglib są już obecne.

Zwróć również uwagę na składnia funkcji. Powinno być:

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

W moim przypadku pominąłem parametr tag i spędziłem dobre 3 dni na wymyślaniu tego.

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

 0
Author: Praveen Kumar KR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 04:21:55

-DCMAKE_CXX_FLAGS=" - llog " pomaga mi

 0
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-17 09:47:08

Dodaj LOCAL_SHARED_LIBRARIES:= liblog na Android.mk może rozwiązać mój problem. Jest to spowodowane tym, że __android_log_print jest zdefiniowane w libLog

 0
Author: nld2019,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-03 07:19:36

Do budowania z Androidem.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 " używając znacznika shared_libs, skorzystaj z poniższego kodu:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
 0
Author: Budhdi Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-31 12:56:58