2012-08-28 14 views
42

में चर के लॉगिंग मानों को मैंने एंड्रॉइड एनडीके में सी ++ के साथ लॉगिंग सेट अप किया है।Android देशी ndk

मैं इस तरह Logcat के लिए एक संदेश मुद्रित कर सकते हैं:

__android_log_write(ANDROID_LOG_INFO, "tag here", "message here"); 

अब मान लीजिए कि मैं एक पूर्णांक testint बुलाया डालते हैं। मैं इस int के मूल्य को कैसे मुद्रित कर सकता हूं?

इस तरह कुछ ऐसा पता प्रिंट करता है, लेकिन मुझे मूल्य चाहिए। मुझे यह करने के तरीके पर सी ++ में कुछ भी नहीं मिला है। किसी भी मदद के लिए धन्यवाद!

__android_log_print(ANDROID_LOG_INFO, "sometag", "%p", *test); 

उत्तर

36

आप __android_log_print जो एक sprintf तरह वाक्य रचना है कि एक स्ट्रिंग में अपने डेटा स्वरूपों का उपयोग करता है इस्तेमाल कर सकते हैं।

__android_log_print(ANDROID_LOG_INFO, "sometag", "test int = %d", testInt); 
11

आपके द्वारा उपलब्ध विविधता लॉग प्रिंट फ़ंक्शन का लाभ उठाएं। अपने कोड के लिए, मैं इसे आसान बनाने के लिए एक LogInfo() फ़ंक्शन प्रदान करता हूं। बेशक यहां आपके लिए कई विकल्प उपलब्ध हैं।

void LogInfo(const char *sTag, const char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    __android_log_vprint(ANDROID_LOG_INFO, sTag, fmt, ap); 
    va_end(ap); 
} 
+0

सबसे अच्छा ऊपर लागू करने के लिए .. .nice – Houston

+1

इस समाधान के लिए धन्यवाद @ एमएए लेकिन मुझे ऊपर दिखाए गए अनुसार इसे ठीक करने में निम्नलिखित त्रुटि मिल रही है: 'ए/libc (18350): 0x00000000 (कोड = 128) पर घातक सिग्नल 7 (सिगबस), थ्रेड 18410 (WebViewCoreThre) '। इसके अलावा, पैरामीटर सही तरीके से मुद्रित नहीं होते हैं, भले ही वे सही स्मृति पते पर इंगित नहीं कर रहे हों। क्या आपको इसके बारे में कोई जानकारी है? बहुत बहुत धन्यवाद – Lisarien

+1

वास्तव में, मुझे '__android_log_vprint' के बजाय' __android_log_print' का उपयोग करने की गलती हुई थी। इस आखिरी के साथ मूल्य कंसोल में अच्छी तरह से प्रदर्शित होते हैं, लेकिन मुझे हमेशा कुछ सेकंड के बाद त्रुटि मिलती है और ऐप मारे जाते हैं। – Lisarien

11

__android_log_print() एक प्रारूप स्ट्रिंग और एक परिवर्तनीय तर्क सूची लेता है। एक निर्दिष्ट हस्ताक्षर मुद्रित करने के लिए आप जिस प्रारूप विनिर्देशक को ढूंढ रहे हैं वह "% d" है। तो कुछ इस तरह तुम क्या चाहते है:

int foo = 42; 
__android_log_print(ANDROID_LOG_INFO, "SomeTag", "foo is %d", foo); 

प्रारूप तार के बारे में अधिक जानकारी के लिए, आप sprintf manual देख सकते हैं।

#include <android/log.h> 

#define LOG_TAG "someTag" 

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) 
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) 
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) 
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) 

... 

// Now you can log very simply like this: 
int foo = 42; 
LOGD("This is a number from JNI: %d", foo); 

इसके अलावा, सुनिश्चित करें कि आप अपने Android.mk में लॉग पुस्तकालय से लिंक करते हैं:

+0

यह स्वीकार्य उत्तर होना चाहिए – hB0

51

यहां सबसे संक्षिप्त तरीके से मैंने देखा है है

LOCAL_LDLIBS := -llog 
+0

मैं इसका उपयोग कर सी ++ स्ट्रिंग कैसे मुद्रित कर सकता हूं? –

+0

वैसे ही बस परिभाषित मैक्रो को कॉल करें: LOGI ("यह एक स्ट्रिंग है"); – Teocci

संबंधित मुद्दे