`__android_log_print 'के लिए अपरिभाषित संदर्भ


100

मेरी फ़ाइल बनाने में क्या गलत है?

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-निर्माण

foo.c:9: undefined reference to `__android_log_print'

जवाबों:


89

अपनी Android.mkफ़ाइल में निम्न का प्रयास करें :

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

1
इसे जोड़ने के लिए क्या आवश्यक है? क्या आप कृपया विस्तार से बताएंगे?
धस्नीम

इसकी फ़ाइल बनाने के लिए एक एंड्रॉइड लाइब्रेरी को जोड़ना - और यह मेरे लिए भी काम किया
घीस

9
-L अनावश्यक है। कृपया इसके बजाय दूसरे उत्तर को स्वीकार करें।
जेफ एलन

5
अगर एंड्रॉइड स्टूडियो 1.3 में नए ग्रैडल एनडीके एकीकरण का उपयोग किया जाता है, तो आपको ldLibs = ["android", "log"]अपने android.ndk विकल्पों में जोड़ना होगा
स्टीफन कैसर

1
अगर हम Android.mk का उपयोग नहीं कर रहे हैं तो क्या होगा?
cagdas

99

आपको जोड़ने की आवश्यकता है

LOCAL_LDLIBS := -llog

to Android.mk


1
सही बात। यदि कई पुस्तकालय हैं, तो उनमें से प्रत्येक के लिए इस कथन को जोड़ने की आवश्यकता है (CLEAR
VARS के

86

यदि आप Android Studio और gradle का उपयोग करते हैं, तो यह Android.mk को अनदेखा करता है। इसे अपनी build.gradle फ़ाइल में जोड़ें:

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

7
मुझे आश्चर्य है कि यह कहां से प्रलेखित है। मैं भी यही चाह रहा था।
रैंडी सुगियंटो 'युकू'

1
मेरे द्वारा जोड़े जाने से पहले मुझे '__android_log_print' का अपरिभाषित संदर्भ मिल रहा था ldLibs। धन्यवाद।
डेनिस नियाज़ेव

2
मेरे लिए यह तय करना जोड़ना। बस प्रोजेक्ट फ़ोल्डर (मॉड्यूल नाम) में से एक के बजाय फ़ोल्डर के ndkअंदर build.gradle में भाग जोड़ना सुनिश्चित करें app
20

ग्रैडल 2.5 के रूप में 'ldLibs + = "लॉग"' मामूली वाक्यविन्यास परिवर्तन का उपयोग करें
Lorne K

15
इसने मेरे लिए काम नहीं किया। यह वही है जो मुझे करना था:ldLibs.addAll(["android", "log"])
what

29

Android Studio 2.2 और tools.build:gradle:2.2.0 के लिए CMakeLists.txt में CMake ऐड या एडिट पंक्ति का उपयोग करके:

target_link_libraries(<your_library_name> 
                      android 
                      log)

आपके लिए लॉग लाइब्रेरी को जोड़ने वाले Thats।


16

यदि आप एंड्रॉइड स्टूडियो 2.1 में अपग्रेड करते हैं, तो उपरोक्त उत्तर काम नहीं करते हैं, नीचे दिए गए काम को लोड करने के लिए ldLibs.add () का उपयोग करने की आवश्यकता है:

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

सर्वश्रेष्ठ आधुनिक (2017 के अंत में) उत्तर
एडगर अर्उटियूनियन

7

हम 3 तरीकों से एंड्रॉइड में एक साझा लाइब्रेरी को लिंक कर सकते हैं। नीचे दिए गए 3 मामलों में, उल्लिखित लाइनों को जोड़ा जाना चाहिएAndroid.mk

तो यहाँ तीन तरीके हैं।

1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog

किसी कारण से यदि 1 काम नहीं किया (यह मेरे लिए काम नहीं किया), तो आप 2 तरीकों से कोशिश कर सकते हैं

2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog

3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog

बेशक आपको #include <android/log.h> अपनी C / H फाइल में शामिल करना होगा।


6

यदि आप जिस परियोजना पर काम कर रहे हैं, उसमें निम्नलिखित विशेषताएं हैं जो अन्य 'मानक' उत्तरों से भिन्न हैं:

  • Android Studio का उपयोग नहीं कर रहा है
  • वर्गीकृत और एकीकृत CMake का उपयोग नहीं करना
  • निर्माण के लिए किसी भी Android.mk या Application.mk का उपयोग नहीं किया गया
  • सीधे सीएमके और टूलचैन का उपयोग करना (शायद आपकी परियोजना क्यूटी आधारित है और बिना क्यूट्रीटर का उपयोग किए बिना)

निम्न लक्ष्य_लिंक_ लाइब्रेरी उपयोग इसे बनाता है:

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

TARGET_NAMEबनाने के लक्ष्य का नाम होने के नाते (इसे पहले add_libraryया साथ सेट किया गया है add_executable)।

find_libraryटूलकिन को ठीक से सेट करने के साथ-साथ समान रूप से महत्वपूर्ण है (एंड्रॉइड एसडीके द्वारा प्रदान किए गए टूलचैन का उपयोग करें ANDROID_SDK_HOME/cmake/<version>/android.toolchain.cmakeताकि यह सेट हो जाए CMAKE_SYSROOTजो find_कमांड द्वारा उपयोग किया जाता है )।


केवल समाधान जिसने मेरी मदद की! एक टन धन्यवाद, मैं इसे एक परीक्षण द्वारा
आगे बढ़ाऊंगा

4

हां, आपको जोड़ने की आवश्यकता है: LOCAL_LDLIBS := -llogजैसा कि अन्य उत्तरों / टिप्पणियों ने निर्दिष्ट किया है, हालांकि मूल प्रश्न यह निर्दिष्ट नहीं करता है कि क्या वह जेनी लाइब्रेरी का उपयोग करता है: LOCAL_JNI_SHARED_LIBRARIESया के रूप में LOCAL_REQUIRED_MODULES

मैं निश्चित रूप से बहुत कुछ कह सकता हूं कि उन्होंने इसका इस्तेमाल इस प्रकार किया है: LOCAL_REQUIRED_MODULESक्योंकि यह LOCAL_EXPORT_LDLIBS := -llogसवाल है ... जब तक कि एक संपादन के बाद इसे जोड़ा नहीं गया।

यदि आप LOCAL_REQUIRED_MODULESसाझा लाइब्रेरी का उपयोग करते हैं तो APK के बजाय / सिस्टम / lib में इंस्टॉल किया गया है, क्योंकि यह एक आवश्यक मॉड्यूल है। इसलिए आपको LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llogबस इसके बजाय जोड़ने की आवश्यकता होगी LOCAL_LDLIBS := -llogताकि जब निर्माण प्रणाली निर्माण और निर्माण साझा की गई लाइब्रेरी को लिंक कर रही है, तो इसकी -llogसही जगह पर परिभाषाएं होंगी, जो निर्माण के लिए उपलब्ध हैं $OUT/root/system/lib। अन्यथा आप एक ही उत्तर प्राप्त करना जारी रखेंगे, भले ही आप केवल जोड़ दें LOCAL_LDLIBS := -llog

इसलिए, जिन लोगों ने टिप्पणी की कि इसकी -Lआवश्यकता नहीं है, और अन्य उत्तर सही थे, वे वास्तव में इस स्थिति में गलत थे।


वास्तव में समझाने के लिए धन्यवाद कि क्या हो रहा है!
रिचर्ड

4

के बदले में

अगर एंड्रॉइड स्टूडियो 1.3 में नए ग्रैडल एनडीके एकीकरण का उपयोग किया जाता है, तो आपको अपने android.ndk विकल्पों में ldLibs = ["android", "लॉग"] जोड़ने की जरूरत है - स्टीफन कैसर 24 सितंबर को 4:20 बजे

ldLibs.addAll(["android", "log"])प्रयोगात्मक प्लगइन के लिए उपयोग करें


3

जोड़ना

LOCAL_SHARED_LIBRARIES:= \
        libbinder                       \
        liblog                          \

to Android.mk


2
क्यों? कृपया बताएं कि यह उत्तर पूछने वाले के लिए क्यों काम करना चाहिए।
L0j1k

1

इससे मुझे मदद मिली:

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

एंड्रॉइड स्टूडियो संस्करण 2.2 और उच्चतर में, जब आप एक नया प्रोजेक्ट बनाते हैं तो सीपीपी के लिए इनबिल्ट सपोर्ट होता है। इसके अलावा, liblog.so डिफ़ॉल्ट रूप से शामिल है। हेडर फ़ाइल (android / log.h) को शामिल करने के अलावा कुछ भी नहीं किया जाना चाहिए।

चेकआउट ऐप / CMakeLists.txt जब हम नए एंड्रॉइड स्टूडियो प्रोजेक्ट बनाते हैं तो स्टूडियो द्वारा बनाया जाता है। हम देख सकते हैं कि loglib के लिए find_library () ब्लॉक और target_link_l लाइब्रेरी () ब्लॉक पहले से मौजूद हैं।

इसके अलावा, फ़ंक्शन सिंटैक्स पर ध्यान दें। यह होना चाहिए:

__android_log_print (int प्राथमिकता, const char * टैग, const char * fmt, ...);

मेरे मामले में, मैंने टैग पैरामीटर छोड़ दिया था और यह पता लगाने में अच्छे 3 दिन बिताने का काम खत्म कर दिया।

CMake के बारे में अधिक जानकारी: अपनी परियोजना में C और C ++ कोड जोड़ें



0

LOCAL_SHARED_LIBRARIES:= liblog Android.mk में जोड़ें मेरे isuue को हल कर सकते हैं। ऐसा इसलिए है क्योंकि यह __android_log_printlibLog में परिभाषित किया गया है


0

Android.bp के साथ निर्माण करने के लिए, नीचे दिए गए समाधान का पालन करें:

इसमें - android_log_print को NDK में परिभाषित किया गया है, इसलिए इसके लिए पहले से ही एक पुस्तकालय उपलब्ध है। शेअर_लिब टैग का उपयोग करके " लिब्लॉग " लाइब्रेरी का उपयोग करें , नीचे दिए गए कोड का संदर्भ लें:

target: {
        android: {
            cppflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"], // can use other dependency if required.
        },
        darwin: {
            enabled: false,
        },
    },  
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.