1. 程式人生 > >Android JNI 學習(三):JNI 數據類型和數據結構

Android JNI 學習(三):JNI 數據類型和數據結構

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 數據類型和數據結構