Apa yang salah dengan file make saya?
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'
android
java-native-interface
logging
android-ndk
alex2k8.dll
sumber
sumber
ldLibs = ["android", "log"]
opsi android.ndkAnda perlu menambahkan
ke Android.mk
sumber
Jika Anda menggunakan Android Studio dan gradle, ini mengabaikan Android.mk. Tambahkan ini ke file build.gradle Anda:
sumber
ldLibs
. Terima kasih.ndk
bagian di build.gradle di dalamapp
folder, bukan di folder proyek (nama modul).ldLibs.addAll(["android", "log"])
Untuk Android Studio 2.2 dan tools.build:gradle:2.2.0 menggunakan CMake, tambahkan atau edit baris di CMakeLists.txt:
Itu menghubungkan perpustakaan log ke perpustakaan Anda.
sumber
Jika Anda mengupgrade ke Android Studio 2.1, jawaban di atas tidak berfungsi, perlu menggunakan ldLibs.add () untuk memuat lib seperti di bawah ini:
sumber
Kami dapat menautkan perpustakaan bersama di Android dengan 3 cara. Di bawah 3 kasus, baris yang disebutkan harus ditambahkan
Android.mk
Jadi inilah tiga cara.
Untuk beberapa alasan jika 1 tidak berfungsi (tidak berhasil untuk saya), Anda dapat mencoba 2 cara di bawah ini
Tentu saja Anda juga perlu memasukkannya ke
#include <android/log.h>
dalam file C / H Anda.sumber
Jika proyek yang Anda kerjakan memiliki karakteristik berikut yang berbeda dari jawaban 'standar' lainnya:
Penggunaan target_link_libraries berikut membuatnya:
Menjadi
TARGET_NAME
nama target yang akan dibangun (setelah menyiapkannya sebelumnya denganadd_library
atauadd_executable
).find_library
sama pentingnya serta menyiapkan toolchain dengan benar (gunakan toolchain yang disediakan oleh Android SDK diANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmake
sehingga menyiapkanCMAKE_SYSROOT
yang digunakan olehfind_
perintah).sumber
Ya, Anda perlu menambahkan:
LOCAL_LDLIBS := -llog
seperti jawaban / komentar lain telah ditentukan, namun pertanyaan asli tidak menentukan apakah dia menggunakan perpustakaan jni sebagai:LOCAL_JNI_SHARED_LIBRARIES
atau sebagaiLOCAL_REQUIRED_MODULES
.Saya dapat mengatakan dengan pasti bahwa dia telah menggunakannya sebagai:
LOCAL_REQUIRED_MODULES
karenaLOCAL_EXPORT_LDLIBS := -llog
dalam pertanyaan ... kecuali itu ditambahkan setelah pengeditan.Jika Anda menggunakan
LOCAL_REQUIRED_MODULES
perpustakaan bersama, instal di / system / lib bukan ke dalam apk, karena itu adalah modul yang diperlukan. Oleh karena itu, Anda perlu menambahkanLOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
alih-alih hanyaLOCAL_LDLIBS := -llog
sehingga ketika sistem build sedang membangun & menautkan pustaka bersama jni, ia akan memiliki-llog
definisi di tempat yang benar, tersedia untuk dibangun di bawah$OUT/root/system/lib
. Jika tidak, Anda akan terus mendapatkan jawaban yang sama, meskipun Anda hanya menambahkanLOCAL_LDLIBS := -llog
.Jadi, mereka yang berkomentar
-L
tidak perlu, dan jawaban lain benar, sebenarnya mereka salah dalam situasi ini.sumber
Sebagai pengganti
digunakan
ldLibs.addAll(["android", "log"])
untuk plugin eksperimentalsumber
Menambahkan
ke Android.mk
sumber
Ini membantu saya:
Android.mk
sumber
Di studio android versi 2.2 dan yang lebih tinggi, terdapat dukungan bawaan untuk CPP saat Anda membuat proyek baru. Selain itu, liblog.so disertakan secara default. Tidak ada yang bisa dilakukan selain menyertakan file header (android / log.h).
Aplikasi Checkout / CMakeLists.txt yang dibuat oleh studio saat kita membuat proyek studio android baru. Kita dapat melihat bahwa blok find_library () dan blok target_link_libraries () untuk loglib sudah ada.
Juga, perhatikan sintaks fungsi. Harus:
Dalam kasus saya, saya telah meninggalkan parameter tag dan akhirnya menghabiskan 3 hari yang baik untuk mencari tahu.
Lebih lanjut tentang CMake: Tambahkan Kode C dan C ++ ke Proyek Anda
sumber
-DCMAKE_CXX_FLAGS = "- llog" bantu saya
sumber
tambahkan
LOCAL_SHARED_LIBRARIES:= liblog
ke Android.mk dapat menyelesaikan masalah saya. Ini karena__android_log_print
didefinisikan di libLogsumber
UNTUK membangun dengan Android.bp, ikuti solusi di bawah ini:
Dalam hal ini - android_log_print ditentukan dalam NDK, jadi untuk ini, sudah ada pustaka yang tersedia. Gunakan library " liblog " menggunakan tag shared_libs , lihat kode di bawah ini:
sumber