सवाल Android देशी ndk में चर के लॉगिंग मान


मैंने लॉगिंग की स्थापना की सी ++ एंड्रॉइड एनडीके में।

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

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

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

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

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

44
2017-08-28 12:34


मूल




जवाब:


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

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

41
2017-08-28 12:39





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

#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 );

साथ ही, सुनिश्चित करें कि आप अपने एंड्रॉइड.एमके में लॉग लाइब्रेरी से लिंक करते हैं:

LOCAL_LDLIBS    := -llog

59
2017-11-21 02:10



मैं इसका उपयोग कर सी ++ स्ट्रिंग कैसे मुद्रित कर सकता हूं? - Noman Akhtar
वैसे ही बस परिभाषित मैक्रो को कॉल करें: LOGI ("यह एक स्ट्रिंग है"); - Teocci
ओह आदमी! यह कमाल का है! मैंने 4 साल पहले इन मैक्रोज़ का इस्तेमाल किया था और यहां मैं फिर से हूं! धन्यवाद ;) - Ahmed Hegazy


आपके पास उपलब्ध विविधता लॉग प्रिंट फ़ंक्शन का लाभ उठाएं। अपने कोड के लिए, मैं इसे आसान बनाने के लिए एक 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);
}

11
2017-08-28 12:46



उपरोक्त को लागू करने के लिए सबसे अच्छा ... अच्छा - Houston
इस समाधान @mah के लिए धन्यवाद, लेकिन मुझे उपरोक्त दिखाए गए अनुसार इसे लागू करने में निम्न त्रुटि प्राप्त हो रही है: A/libc(18350): Fatal signal 7 (SIGBUS) at 0x00000000 (code=128), thread 18410 (WebViewCoreThre)। इसके अलावा, पैरामीटर सही तरीके से मुद्रित नहीं होते हैं, भले ही वे सही स्मृति पते पर इंगित नहीं कर रहे हों। क्या आपको इसके बारे में कोई जानकारी है? बहुत बहुत धन्यवाद - Lisarien
वास्तव में, मुझे उपयोग करने की गलती थी __android_log_print के बजाय __android_log_vprint। इस आखिरी के साथ मूल्य कंसोल में अच्छी तरह से प्रदर्शित होते हैं, लेकिन मुझे हमेशा कुछ सेकंड के बाद त्रुटि मिलती है और ऐप मारे जाते हैं। - Lisarien
@Lisarien आपके द्वारा चिपकाई गई त्रुटि का अर्थ है कि आपने एक पूर्ण स्मृति स्थान तक पहुंचने का प्रयास किया है - आप संभावित रूप से एक पॉइंटर का उपयोग कर रहे हैं जिसे ठीक से प्रारंभ नहीं किया गया है। स्टैक ओवरफ़्लो की टिप्पणियों की सुविधा के माध्यम से निदान करने के लिए इसकी कई संभावनाएं हैं। मैं सुझाव दूंगा कि आप यह पता लगाने की कोशिश करें कि त्रुटि किस प्रकार होती है (अतिरिक्त लॉग स्टेटमेंट जोड़कर यह देखने के लिए कि आपका कोड कितना दूर है)। यदि आप अभी भी इसे समझ नहीं सकते हैं, तो आपको त्रुटि के साथ एक प्रश्न पोस्ट करना चाहिए और कोड के क्षेत्र में क्रैश होता है। - mah
मैं जो देख रहा हूं उसका कारण नहीं जानता (जो इसे एक नए प्रश्न के रूप में पोस्ट करने का एक और अच्छा कारण है; आपको केवल मुझसे ज्यादा ध्यान मिलेगा)। यदि आप बस एक त्वरित फिक्स चाहते हैं, तो आपका विवरण इसे एडम के मैक्रो आधारित सुझाव (इस पृष्ठ पर उत्तर दिया गया) जैसा लगता है। - mah


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

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

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


11
2017-08-29 07:03



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