【 Android 】 JNI -> jlong 型のデバッグ
JNI の jlong 型は、64bit環境と32bit環境で型が変わる。
- 64bit 環境では、Jlong は long 型
- 32bit 環境では、Jlong は long long 型
https://cs.android.com/android/platform/superproject/+/master:libnativehelper/include_jni/jni.h;l=35
/* Primitive types that match up with Java equivalents. */ typedef uint8_t jboolean; /* unsigned 8 bits */ typedef int8_t jbyte; /* signed 8 bits */ typedef uint16_t jchar; /* unsigned 16 bits */ typedef int16_t jshort; /* signed 16 bits */ typedef int32_t jint; /* signed 32 bits */ typedef int64_t jlong; /* signed 64 bits */ <--- Jlong は 64bit typedef float jfloat; /* 32-bit IEEE 754 */ typedef double jdouble; /* 64-bit IEEE 754 */
https://cs.android.com/android/platform/superproject/+/master:bionic/libc/include/stdint.h;l=42
#if defined(__LP64__) typedef long __int64_t; <--- 64bit 環境では、int64_t は long 型 typedef unsigned long __uint64_t; #else typedef long long __int64_t; <--- 32bit 環境では、int64_t は long long 型 typedef unsigned long long __uint64_t; #endif
jlong 型の値をデバックしたい場合、下記のように 64bit, 32bit 環境とに分けて記述しないとエラーとなる。
printf だとログ出力されないので ALOGD を使用する。
ALOGD の書式は printf と同じ。
static void example(jlong hoge) { #ifdef __LP64__ // 64bit // printf("__LP64__ [%lx]", hoge); だとログ出力されない ALOGD("__LP64__ [%lx]", hoge); #else // 32bit // printf("NOT __LP64__ : [%llx]", hoge); だとログ出力されない ALOGD("NOT __LP64__ : [%llx]", hoge); #endif }