言語は 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 の型の対応は単純ではなく、実際には多少プラットフォームに依存します。印刷の目的上、注意深く監視する必要があります。そう:
jchar
char ではありません。ですunsigned short
。短縮するchar
とデータが失われます。
jlong
ではありませんlong
、それはlong long
(64 ビット整数) です
jboolean
signed char です ( boolean
C にはデータ型はありません)
jbyte
signed char です ( byte
C にはデータ型はありません)
jint
はint
(Android の場合)
jfloat
はfloat
jshort
はshort
jdouble
はdouble