tsuyoshin’s Tech Blog

https://qrunch.net/@tsuyoshin から移転してきました。

【 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_tlongtypedef unsigned long __uint64_t;
#else
typedef long long __int64_t;       <--- 32bit 環境では、int64_tlong longtypedef 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
}