2012-08-28 17 views
42

Android NDKのC++でロギングをセットアップしました。Androidネイティブndkの変数の値のロギング

私はこのようなlogcatにメッセージを印刷することができます。

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

を今度は私がtestintと呼ばれる整数を持っているとしましょう。このintの値を出力するにはどうすればよいですか?

このようなものは、アドレスを出力しますが、値が必要です。これを行う方法については、C++には何も見つかりませんでした。助けてくれてありがとう!

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

答えて

36

あなたは、文字列にデータをフォーマットsprintf様な構文を使用しています__android_log_printを使用することができます。

__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

このソリューションをお寄せいただきありがとうございます。しかし、上記のように正しく実装すると、次のエラーが発生します: 'A/libc(18350):0x00000000(コード= 128)の致命的なシグナル7(SIGBUS)、スレッド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

これを使ってC++の文字列をどのように出力できますか? –

+0

同じ方法で、定義されたマクロを呼び出すだけです: LOGI( "This is a String"); – Teocci

関連する問題