语言是 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
是一个可变参数函数 - 它接受可变数量的参数(但不少于三个),前三个之外的未知类型。额外参数的类型是从格式字符串中的格式说明符推导出来的 - %-sequences。%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);
我在这里刻意避免字符类型转换的棘手问题;对于 %c 格式说明符,该函数需要一个char
与jchar
. 对于非 ASCII 字符的 jchar,此代码段将打印垃圾。
仅供参考:Java 类型和 C 类型之间的对应关系并不简单,实际上它有点依赖于平台。出于打印的目的,您需要仔细观察。所以:
jchar
不是字符;它是unsigned short
。缩短到char
丢失数据。
jlong
不是long
,它是long long
(64 位整数)
jboolean
是有符号字符(boolean
C 中没有数据类型)
jbyte
是有符号字符(byte
C 中没有数据类型)
jint
是int
(在 Android 上)
jfloat
是float
jshort
是short
jdouble
是double