BETA

[ Android ] JNI -> jlong 型のデバッグ

投稿日:2020-07-28
最終更新:2020-08-06

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  
}  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@tsuyoshinの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう