referensi tidak terdefinisi ke `__android_log_print '

100

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'
alex2k8.dll
sumber

Jawaban:

89

Coba yang berikut ini di Android.mkfile Anda :

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
Ryan Reeves
sumber
1
Apa perlunya menambahkan ini? Tolong jelaskan secara rinci.
Dhasneem
itu menambahkan perpustakaan android ke file make - dan itu bekerja untuk saya juga
gheese
9
-L tidak diperlukan. Harap terima jawaban lain sebagai gantinya.
Jeff Allen
5
Jika menggunakan integrasi Gradle NDK baru di Android Studio 1.3, Anda perlu menambahkan ldLibs = ["android", "log"]opsi android.ndk
Stephen Kaiser
1
Bagaimana jika kita tidak menggunakan Android.mk?
cagdas
99

Anda perlu menambahkan

LOCAL_LDLIBS := -llog

ke Android.mk

Kyle
sumber
1
benar. jika ada beberapa pustaka, perlu menambahkan pernyataan ini untuk masing-masing pustaka (setelah CLEAR VARS)
pengguna13107
86

Jika Anda menggunakan Android Studio dan gradle, ini mengabaikan Android.mk. Tambahkan ini ke file build.gradle Anda:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}
Bosan
sumber
7
Saya bertanya-tanya di mana ini didokumentasikan. Saya mencari ini juga.
Randy Sugianto 'Yuku'
1
Saya mendapatkan "referensi tidak ditentukan ke '__android_log_print'" sebelum saya menambahkan ldLibs. Terima kasih.
Denis Kniazhev
2
Menambahkan ini memperbaikinya untuk saya. Pastikan untuk menambahkan ndkbagian di build.gradle di dalam appfolder, bukan di folder proyek (nama modul).
mathiass
Mulai Gradle 2.5 gunakan 'ldLibs + = "log"' sedikit perubahan sintaks
Lorne K
15
ini TIDAK berhasil untuk saya. inilah yang harus saya lakukan:ldLibs.addAll(["android", "log"])
ᴛʜᴇᴘᴀᴛᴇʟ
29

Untuk Android Studio 2.2 dan tools.build:gradle:2.2.0 menggunakan CMake, tambahkan atau edit baris di CMakeLists.txt:

target_link_libraries(<your_library_name> 
                      android 
                      log)

Itu menghubungkan perpustakaan log ke perpustakaan Anda.

lewkka
sumber
16

Jika Anda mengupgrade ke Android Studio 2.1, jawaban di atas tidak berfungsi, perlu menggunakan ldLibs.add () untuk memuat lib seperti di bawah ini:

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}
DroidlikeCode
sumber
jawaban modern terbaik (akhir 2017)
Edgar Aroutiounian
7

Kami dapat menautkan perpustakaan bersama di Android dengan 3 cara. Di bawah 3 kasus, baris yang disebutkan harus ditambahkanAndroid.mk

Jadi inilah tiga cara.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Untuk beberapa alasan jika 1 tidak berfungsi (tidak berhasil untuk saya), Anda dapat mencoba 2 cara di bawah ini

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

Tentu saja Anda juga perlu memasukkannya ke #include <android/log.h> dalam file C / H Anda.

mk ..
sumber
6

Jika proyek yang Anda kerjakan memiliki karakteristik berikut yang berbeda dari jawaban 'standar' lainnya:

  • Tidak menggunakan Android Studio
  • Tidak menggunakan gradle dan CMake terintegrasi
  • Tidak ada Android.mk atau Application.mk yang digunakan sama sekali untuk build
  • Menggunakan CMake dan toolchain secara langsung (mungkin proyek Anda berbasis Qt dan tanpa menggunakan QtCreator juga)

Penggunaan target_link_libraries berikut membuatnya:

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

Menjadi TARGET_NAMEnama target yang akan dibangun (setelah menyiapkannya sebelumnya dengan add_libraryatau add_executable).

find_librarysama pentingnya serta menyiapkan toolchain dengan benar (gunakan toolchain yang disediakan oleh Android SDK di ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakesehingga menyiapkan CMAKE_SYSROOTyang digunakan oleh find_perintah).

DNax
sumber
Satu-satunya solusi yang membantu saya! Terima kasih banyak, saya akan memperpanjangnya dengan tes jika perpustakaan ditemukan untuk umpan balik yang lebih baik kepada pengembang seperti di sini stackoverflow.com/a/37868829/10030695
ManuelTS
4

Ya, Anda perlu menambahkan: LOCAL_LDLIBS := -llogseperti jawaban / komentar lain telah ditentukan, namun pertanyaan asli tidak menentukan apakah dia menggunakan perpustakaan jni sebagai: LOCAL_JNI_SHARED_LIBRARIESatau sebagai LOCAL_REQUIRED_MODULES.

Saya dapat mengatakan dengan pasti bahwa dia telah menggunakannya sebagai: LOCAL_REQUIRED_MODULESkarena LOCAL_EXPORT_LDLIBS := -llogdalam pertanyaan ... kecuali itu ditambahkan setelah pengeditan.

Jika Anda menggunakan LOCAL_REQUIRED_MODULESperpustakaan bersama, instal di / system / lib bukan ke dalam apk, karena itu adalah modul yang diperlukan. Oleh karena itu, Anda perlu menambahkan LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llogalih-alih hanya LOCAL_LDLIBS := -llogsehingga ketika sistem build sedang membangun & menautkan pustaka bersama jni, ia akan memiliki -llogdefinisi 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 menambahkan LOCAL_LDLIBS := -llog.

Jadi, mereka yang berkomentar -Ltidak perlu, dan jawaban lain benar, sebenarnya mereka salah dalam situasi ini.

SudoSURoot
sumber
Terima kasih telah benar-benar menjelaskan apa yang terjadi!
Richard
4

Sebagai pengganti

Jika menggunakan integrasi Gradle NDK baru di Android Studio 1.3, Anda perlu menambahkan ldLibs = ["android", "log"] ke opsi android.ndk - Stephen Kaiser 24 Sep pukul 4:20

digunakan ldLibs.addAll(["android", "log"])untuk plugin eksperimental

sethbabs.dll
sumber
3

Menambahkan

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

ke Android.mk

pengguna3535040
sumber
2
Mengapa? Tolong jelaskan mengapa jawaban ini harus berhasil untuk penanya.
L0j1k
1

Ini membantu saya:

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
sumber
0

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:

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

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

Praveen Kumar KR
sumber
0

-DCMAKE_CXX_FLAGS = "- llog" bantu saya

James
sumber
0

tambahkan LOCAL_SHARED_LIBRARIES:= liblog ke Android.mk dapat menyelesaikan masalah saya. Ini karena __android_log_printdidefinisikan di libLog

nld2019
sumber
0

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:

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