__android_log_print için tanımsız referans


100

Yapma dosyamın nesi var?

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'

Yanıtlar:


89

Android.mkDosyanızda aşağıdakileri deneyin :

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

1
Bunu eklemek için gerekli olan nedir? Lütfen detaylı açıklar mısınız?
Dhasneem

make dosyasına bir android kitaplığı ekliyor - ve benim için de çalıştı
gheese

9
-L gereksizdir. Lütfen bunun yerine diğer cevabı kabul edin.
Jeff Allen

5
Android Studio 1.3'te yeni Gradle NDK entegrasyonunu kullanıyorsanız, ldLibs = ["android", "log"]android.ndk seçeneklerinize eklemeniz gerekir
Stephen Kaiser

1
Ya Android.mk'leri kullanmıyorsak?
cagdas

99

Eklemeniz gerekiyor

LOCAL_LDLIBS := -llog

Android.mk'ye


1
doğru. birden fazla kitaplık varsa, her biri için bu ifadeyi eklemeniz gerekir (CLEAR
VARS'tan

86

Android Studio ve gradle kullanıyorsanız, Android.mk'yi yok sayar. Bunu build.gradle dosyanıza ekleyin:

android {
    defaultConfig {
        ndk {
            moduleName "your_module_name"
            ldLibs "log"
        }
    }
}

7
Bunun nerede belgelendiğini merak ediyorum. Ben de bunu arıyordum.
Randy Sugianto 'Yuku'

1
Eklemeden önce "__android_log_print" için tanımsız başvuru "alıyordum ldLibs. Teşekkürler.
Denis Kniazhev

2
Bunu eklemek benim için sorunu çözdü. Sadece proje klasöründeki (modül adı) yerine klasörün ndkiçindeki build.gradle içindeki parçayı eklediğinizden emin olun app.
mathiass

Gradle 2.5'ten itibaren 'ldLibs + = "log"' küçük sözdizimi değişikliği kullanın
Lorne K

15
Bu benim için işe yaramadı. yapmam gereken ldLibs.addAll(["android", "log"])
buydu

29

CMake kullanarak Android Studio 2.2 ve tools.build:gradle:2.2.0 için CMakeLists.txt dosyasında satır ekle veya düzenle:

target_link_libraries(<your_library_name> 
                      android 
                      log)

Bu, günlük kitaplığınızı sizinkine bağlar.


16

Android Studio 2.1'e yükseltirseniz, yukarıdaki cevaplar işe yaramaz, lib'i aşağıdaki gibi yüklemek için ldLibs.add () kullanmanız gerekir:

android.ndk {
    moduleName = "[the_module_name]"
    ldLibs.addAll(['android', 'log'])
}

en modern (2017 sonu) yanıtı
Edgar Aroutiounian

7

Android'de paylaşılan bir kitaplığı 3 şekilde bağlayabiliriz. Aşağıdaki 3 durumda, belirtilen satırlar eklenmelidirAndroid.mk

İşte üç yol.

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

Bazı nedenlerden dolayı 1 işe yaramazsa (benim için işe yaramadı), 2 yolu deneyebilirsiniz.

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

Elbette #include <android/log.h> C / H dosyanıza da eklemeniz gerekir .


6

Üzerinde çalıştığınız projenin diğer 'standart' cevaplardan farklı aşağıdaki özelliklere sahip olması durumunda:

  • Android Studio kullanmama
  • Gradle ve entegre CMake kullanmama
  • Derleme için Android.mk veya Application.mk kullanılmadı
  • CMake ve araç zincirini doğrudan kullanma (belki projeniz Qt tabanlıdır ve QtCreator kullanmadan da olabilir)

Aşağıdaki target_link_libraries kullanımı bunu yapar:

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

İnşa TARGET_NAMEedilecek hedefin adı olmak (daha önce add_libraryveya ile ayarlamış olmak add_executable).

find_libraryaraç zincirini doğru bir şekilde kurmanın yanı sıra eşit derecede önemlidir (Android SDK tarafından sağlanan araç zincirini kullanın, ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakeböylece komutlar CMAKE_SYSROOTtarafından kullanılanı ayarlar find_).


Bana yardımcı olan tek çözüm! Çok teşekkürler, kitaplık geliştiriciye daha iyi geri bildirim için bulunursa, burada stackoverflow.com/a/37868829/10030695
ManuelTS

4

Evet, eklemek gerekir: LOCAL_LDLIBS := -llog: diğer cevaplar / yorum belirlediğimiz gibi o kadar jni kütüphane kullanırsanız, ancak orijinal soru belirtmedi LOCAL_JNI_SHARED_LIBRARIESveya LOCAL_REQUIRED_MODULES.

Bunu şu şekilde kullandığından emin olabilirim: sorudaki LOCAL_REQUIRED_MODULESyüzünden LOCAL_EXPORT_LDLIBS := -llog... bir düzenlemeden sonra eklenmemişse.

LOCAL_REQUIRED_MODULESPaylaşılan kitaplığı kullanırsanız , gerekli bir modül olduğu için apk yerine / system / lib içine kurulur. Bu nedenle , derleme sistemi jni paylaşılan kitaplığını oluşturup bağlarken, tanımların altına inşa edilebilecek doğru yerde sahip olacak şekilde eklemek LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llogyerine eklemeniz gerekecektir . Aksi takdirde, sadece ekleseniz bile aynı cevabı almaya devam edeceksiniz .LOCAL_LDLIBS := -llog-llog$OUT/root/system/libLOCAL_LDLIBS := -llog

Yani, -Lgerek olmadığını, diğer cevabın doğru olduğunu söyleyenler, bu durumda aslında yanlıştı.


Gerçekten neler olduğunu açıkladığınız için teşekkür ederiz!
Richard

4

Yerine

Android Studio 1.3'te yeni Gradle NDK entegrasyonunu kullanıyorsanız android.ndk seçeneklerinize ldLibs = ["android", "log"] eklemeniz gerekir - Stephen Kaiser 24 Eylül, 4:20

kullanmak ldLibs.addAll(["android", "log"])deneysel eklentisi için


3

Ekle

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

Android.mk'ye


2
Neden? Lütfen bu cevabın soruyu soran için neden işe yaraması gerektiğini açıklayın.
L0j1k

1

Bu bana yardımcı oldu:

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)

0

Android stüdyo sürüm 2.2 ve üzeri sürümlerde, yeni bir proje oluşturduğunuzda CPP için dahili destek vardır. Ayrıca, liblog.so varsayılan olarak dahil edilmiştir. Başlık dosyası (android / log.h) eklemenin dışında yapılacak bir şey yok.

Yeni android stüdyo projesi oluşturduğumuzda stüdyo tarafından oluşturulan Checkout uygulaması / CMakeLists.txt. Loglib için find_library () bloğunun ve target_link_libraries () bloğunun zaten mevcut olduğunu görebiliriz.

Ayrıca, işlev söz dizimine dikkat edin. Olmalı:

__android_log_print (int öncelik, sabit karakter * etiketi, const char * fmt, ...);

Benim durumumda, etiket parametresini atlamıştım ve onu bulmak için iyi 3 gün harcadım.

CMake hakkında daha fazla bilgi: Projenize C ve C ++ Kodu Ekleyin


0

-DCMAKE_CXX_FLAGS = "- llog" bana yardımcı oluyor


0

LOCAL_SHARED_LIBRARIES:= liblog Android.mk'ye ekle sorunumu çözebilir. Bunun nedeni, __android_log_printlibLog'da tanımlanmış olmasıdır


0

Android.bp ile oluşturmak için aşağıdaki çözümü uygulayın:

Bunda - android_log_print NDK'da tanımlanmıştır, bu yüzden bunun için zaten bir kitaplık mevcuttur. Shared_libs etiketini kullanarak " liblog " kitaplığını kullanın , aşağıdaki kodu referans alın:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.