2

エラーを見つけるためにコードに print ステートメントを追加しようとしていますが、LogCat に表示する整数、バイト、ジント、または文字列以外のものを取得できないようです。

#define LOG_INFO( info ) __android_log_print( ANDROID_LOG_WARN, "NATIVE CODE", info );


LOG_INFO( "c = " + c );

これの結果はちょうど

c = 

私が間違っていることを誰かが知っていますか、またはこれが可能な場合は? 私は jints、ints、chars、jchars、および bytes (の型としてc) を試しました。

4

1 に答える 1

4

言語は C です。C には文字列の組み込み型がありません。文字列は、実際には の配列charまたはポインタcharです。配列もポインタも追加できません。+そのため、演算子による文字列の連結や、その他の演算子による文字列の連結はありません。C++ は異なりますが、ここでは触れません。

__android_log_print() の仕組みは、Java の String.format() に似ています。文字を LogCat に出力するには、次の呼び出しを使用します。

__android_log_print(ANDROID_LOG_WARN, "NATIVE CODE", "c=%c", (char)c);

複数の変数 (char と int など) を出力する場合、呼び出しは次のようになります。

int n;
__android_log_print(ANDROID_LOG_WARN, "NATIVE CODE", "c=%c, n=%d", (char)c, n);

__android_log_printは可変個引数関数です - 可変数の引数 (ただし 3 つ以上) を取り、最初の 3 つを超える型は不明です。追加の引数の型は、書式文字列の書式指定子 (% シーケンス) から推測されます。%c は char を意味し、%d は int を意味し、%s は char 文字列などを意味します。調べてください。

これはprintf、C の世界全体で使用されるパターンです。0、1、2 などのパラメーターを出力するための個別のマクロを導入する意思がない限り、マクロ化には簡単には向いていません。そうすれば、次のようになります。

#define LOG_INFO0( info ) __android_log_print( ANDROID_LOG_WARN, "NATIVE CODE", info );
#define LOG_INFO1( info, p1 ) __android_log_print( ANDROID_LOG_WARN, "NATIVE CODE", info, p1 );
#define LOG_INFO2( info, p1, p2 ) __android_log_print( ANDROID_LOG_WARN, "NATIVE CODE", info, p1, p2 );

//...
LOG_INFO("c=%c", (char)c);

ここでは、文字型変換の厄介な問題を意図的に避けています。char%c 書式指定子の場合、関数はと同じではない型のパラメーターを期待していますjchar。非 ASCII 文字である jchar の場合、このスニペットはガベージを出力します。

参考までに: Java の型と C の型の対応は単純ではなく、実際には多少プラットフォームに依存します。印刷の目的上、注意深く監視する必要があります。そう:

  • jcharchar ではありません。ですunsigned short。短縮するcharとデータが失われます。
  • jlongではありませんlong、それはlong long(64 ビット整数) です
  • jbooleansigned char です ( booleanC にはデータ型はありません)
  • jbytesigned char です ( byteC にはデータ型はありません)
  • jintint(Android の場合)
  • jfloatfloat
  • jshortshort
  • jdoubledouble
于 2012-08-07T18:58:52.740 に答える