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'
ldLibs = ["android", "log"]
do swojego android.ndk opcjeMusisz dodać
do Android.mk
źródło
Jeśli używasz Android Studio i Gradle, ignoruje on Android.mk. Dodaj to do swojego pliku build.gradle:
źródło
ldLibs
. Dzięki.ndk
część w pliku build.gradle znajduje się wapp
folderze, a nie w folderze projektu (nazwa modułu).ldLibs.addAll(["android", "log"])
W przypadku Android Studio 2.2 i tools.build:gradle:2.2.0 przy użyciu CMake dodaj lub edytuj wiersz w CMakeLists.txt:
To łączy bibliotekę dzienników z Twoją.
źródło
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:
źródło
Możemy połączyć udostępnioną bibliotekę w systemie Android na 3 sposoby. W poniższych 3 przypadkach wspomniane wiersze należy dodać w
Android.mk
Oto trzy sposoby.
Z jakiegoś powodu, jeśli 1 nie działa (nie działa dla mnie), możesz wypróbować poniżej 2 sposoby
Oczywiście musisz również dołączyć do
#include <android/log.h>
pliku C / H.źródło
W przypadku, gdy projekt, nad którym pracujesz, ma następujące cechy, które różnią się od innych `` standardowych '' odpowiedzi:
Sprawia to następujące użycie target_link_libraries :
Jest
TARGET_NAME
nazwą celu do zbudowania (po skonfigurowaniu go wcześniej za pomocąadd_library
lubadd_executable
).find_library
jest 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.cmake
aby skonfigurować,CMAKE_SYSROOT
który jest używany przezfind_
polecenia).źródło
Tak, musisz dodać:
LOCAL_LDLIBS := -llog
jak wskazały inne odpowiedzi / komentarze, jednak pierwotne pytanie nie określało, czy używa biblioteki jni jako:LOCAL_JNI_SHARED_LIBRARIES
czy jakoLOCAL_REQUIRED_MODULES
.Z całą pewnością mogę powiedzieć, że użył go jako:
LOCAL_REQUIRED_MODULES
ze względuLOCAL_EXPORT_LDLIBS := -llog
na pytanie ... chyba, że zostało dodane po edycji.Jeśli korzystasz
LOCAL_REQUIRED_MODULES
z 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 -llog
zamiast tylko poLOCAL_LDLIBS := -llog
to, aby system kompilacji budował i łączył współdzieloną bibliotekę jni, miał-llog
definicje 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 dodaszLOCAL_LDLIBS := -llog
.Tak więc ci, którzy komentowali, że
-L
nie jest potrzebny, a druga odpowiedź była poprawna, w rzeczywistości byli w tej sytuacji błędni.źródło
Zamiast
używać
ldLibs.addAll(["android", "log"])
dla eksperymentalnej wtyczkiźródło
Dodaj
do Android.mk
źródło
Pomogło mi to:
Android.mk
źródło
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ć:
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
źródło
-DCMAKE_CXX_FLAGS = "- llog" mi pomaga
źródło
dodaj
LOCAL_SHARED_LIBRARIES:= liblog
do Android.mk może rozwiązać mój problem. Dzieje się tak, ponieważ__android_log_print
jest on zdefiniowany w libLogźródło
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:
źródło