आप std::streambuf
से प्राप्त कक्षा बना सकते हैं जो वर्णों के उत्पादित अनुक्रम को भेजने के लिए एंड्रॉइड विशिष्ट कार्यों का उपयोग करता है। मुझे नहीं पता कि std::cout
का डिफ़ॉल्ट कार्यान्वयन एंड्रॉइड पर वर्ण भेजता है, हालांकि।
class androidbuf : public std::streambuf {
public:
enum { bufsize = 128 }; // ... or some other suitable buffer size
androidbuf() { this->setp(buffer, buffer + bufsize - 1); }
private:
int overflow(int c)
{
if (c == traits_type::eof()) {
*this->pptr() = traits_type::to_char_type(c);
this->sbumpc();
}
return this->sync()? traits_type::eof(): traits_type::not_eof(c);
}
int sync()
{
int rc = 0;
if (this->pbase() != this->pptr()) {
char writebuf[bufsize+1];
memcpy(writebuf, this->pbase(), this->pptr() - this->pbase());
writebuf[this->pptr() - this->pbase()] = '\0';
rc = __android_log_write(ANDROID_LOG_INFO, "std", writebuf) > 0;
this->setp(buffer, buffer + bufsize - 1);
}
return rc;
}
char buffer[bufsize];
};
वास्तव में std::cout
सेट करने के लिए इस धारा बफर करने के लिए लिखने के लिए, आप अपने main()
समारोह में कुछ इस तरह करना होगा::
int main() {
std::cout.rdbuf(new androidbuf);
...
}
यह एक स्मृति बनाने मूलतः, यह कुछ इस तरह दिखेगा एक androidbuf
धारा के लिए रिसाव, हालांकि, कुछ हद तक जानबूझकर है: main()
के बाद स्ट्रीम को लिखा जा सकता है और जब std::cout
नष्ट हो जाता है तो यह फ़्लश हो जाता है। आप इस नहीं करना चाहते हैं, आप या तो std::cout
की मूल धारा बफर बहाल करने या इसे सेट शून्य पर और rdbuf()
से वापसी हटा सकता है:
// avoid a one-time resource leak but don't get output afterwards:
delete std::cout.rdbuf(0);
स्रोत
2012-01-15 14:13:00
सबसेट: stdout अनुप्रेषित Logcat रहे हैं: http://stackoverflow.com/questions/10531050/redirect-stdout-to-logcat-in-android-ndk की –
संभावित डुप्लिकेट [सी/सी ++ printfs - यह एंड्रॉइड मूल कोड में कहां दिखाई देता है?] (Https://stackoverflow.com/questions/6426911/cc-printfs-wheres-it-appears-in-a-android-native-code) –