Android JNI 學習(三):JNI 數據類型和數據結構
阿新 • • 發佈:2018-11-11
pub bsp 強制 int mat bool table sign java vm
本文我們來討論一下JNI如何將Java類型映射到本機C類型。
一、基本數據類型
如下圖表整理了Java基本類型和native對應的關系:
Java類型 | Native類型 | 描述 |
boolean | jboolean | unsigned 8 bits |
byte | jbyte | signed 8 bits |
char | jchar | unsigned 16 bits |
short | jshort | signed 16 bits |
int | jint | signed 32 bits |
long | jlong | signed 64 bits |
float | jfloat | 32 bits |
double | jdouble | 64 bits |
void | void | N/A |
二、引用類型
JNI 包含許多與不同類型的Java對象相對應的引用類型。JNI引用類型按層次結構組織,如圖所示:
在C中,所有其他JNI引用類型都定義為與jobject相同。例如:
typedef jobject jclass;
在C ++中,JNI引入了一組虛擬類來強制執行子類型關系。例如:
class _jobject {}; class _jclass : public _jobject {}; ... typedef _jobject *jobject; typedef _jclass*jclass;
三、字段和方法ID
方法和字段ID是常規C指針類型:
struct _jfieldID; /* opaque structure */ typedef struct _jfieldID *jfieldID; /* field IDs */ struct _jmethodID; /* opaque structure */ typedef struct _jmethodID *jmethodID; /* method IDs */
四、類型簽名
JNI 使用Java VM的類型簽名表示。下圖顯示了這些類型的簽名:
類型簽名 | Java類型 |
Z | boolean |
B | byte |
C | char |
S | short |
I | int |
J | long |
F | float |
D | double |
L fully-qualified-class ; | fully-qualified-class |
[ type | type[] |
( arg-types ) ret-type | method type |
舉個例子,Java方法:
long f (int n, String s, int[] arr);
對應的方法類型簽名為:
(ILjava/lang/String;[I)J
Android JNI 學習(三):JNI 數據類型和數據結構