2

我试图在我的代码中添加打印语句以查找错误,但似乎无法获取整数或字节或 jints 或除字符串以外的任何其他内容以在 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是一个可变参数函数 - 它接受可变数量的参数(但不少于三个),前三个之外的未知类型。额外参数的类型是从格式字符串中的格式说明符推导出来的 - %-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 格式说明符,该函数需要一个charjchar. 对于非 ASCII 字符的 jchar,此代码段将打印垃圾。

仅供参考:Java 类型和 C 类型之间的对应关系并不简单,实际上它有点依赖于平台。出于打印的目的,您需要仔细观察。所以:

  • jchar不是字符;它是unsigned short。缩短到char丢失数据。
  • jlong不是long,它是long long(64 位整数)
  • jboolean是有符号字符(booleanC 中没有数据类型)
  • jbyte是有符号字符(byteC 中没有数据类型)
  • jintint(在 Android 上)
  • jfloatfloat
  • jshortshort
  • jdoubledouble
于 2012-08-07T18:58:52.740 回答