Android NDK開發中java資料型別與C/C++資料型別的對應關係

smilestone322發表於2019-03-16

轉自:http://blog.csdn.net/z13144099248m/article/details/41675007

 

在java中有兩種資料型別:

1、引用資料型別:字串類,陣列類以及其他類

 

    引用型別與其原生型別的對應關係如下表:

Java型別 原生型別
 java.lang.Class jclass
java.lang.Throwable jthrowable
java.lang.String jstring
其他的Object類 jobject
java.lang.Object[] jobjectArray
boolean[] jbooleanArray
byte[] jbyteArray
char[] jcharArray
short[] jshortArray
int[] jintArray
long[] jlongArray
float[] jfloatArray
double[] jdoubleArray
其他型別的陣列 Jarray

 

2、基本資料型別:boolean,byte,char,short,int,long,float以及double

 

    基本資料型別可以直接與C/C++的相應的基本資料型別相對應,如下表所示:

Java型別 JNI型別 C/C++型別 大小
boolean jboolean unsigned char 無符號8位
byte jbyte char 有符號8位
char jchar unsigned short 無符號16位
short jshort short 有符號16位
int jint int 有符號32位
long jlong long long 有符號64位
float jfloat float 32位
double jdouble double

64位



轉自:http://carywei.iteye.com/blog/1075647

Android JNI 使用的資料結構JNINativeMethod詳解

2009-04-02 15:53

Andoird 中使用了一種不同傳統Java JNI的方式來定義其native的函式。其中很重要的區別是Andorid使用了一種Java 和 C 函式的對映表陣列,並在其中描述了函式的引數和返回值。這個陣列的型別是JNINativeMethod,定義如下:

 

typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;

Android JNI 使用的資料結構JNINativeMethod詳解

2009-04-02 15:53

Andoird 中使用了一種不同傳統Java JNI的方式來定義其native的函式。其中很重要的區別是Andorid使用了一種Java 和 C 函式的對映表陣列,並在其中描述了函式的引數和返回值。這個陣列的型別是JNINativeMethod,定義如下:

 

typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;

第一個變數name是Java中函式的名字。

第二個變數signature,用字串是描述了函式的引數和返回值

第三個變數fnPtr是函式指標,指向C函式。

 

其中比較難以理解的是第二個引數,例如

"()V"

"(II)V"

"(Ljava/lang/String;Ljava/lang/String;)V"

 

實際上這些字元是與函式的引數型別一一對應的。

"()" 中的字元表示引數,後面的則代表返回值。例如"()V" 就表示void Func();

"(II)V" 表示 void Func(int, int);

 

具體的每一個字元的對應關係如下

 

字元 Java型別 C型別

V      void            void
Z       jboolean     boolean
I        jint              int
J       jlong            long
D      jdouble       double
F      jfloat            float
B      jbyte            byte
C      jchar           char
S      jshort          short

 

陣列則以"["開始,用兩個字元表示

 

[I       jintArray      int[]
[F     jfloatArray    float[]
[B     jbyteArray    byte[]
[C    jcharArray    char[]
[S    jshortArray   short[]
[D    jdoubleArray double[]
[J     jlongArray     long[]
[Z    jbooleanArray boolean[]

 

上面的都是基本型別。如果Java函式的引數是class,則以"L"開頭,以";"結尾中間是用"/" 隔開的包及類名。而其對應的C函式名的引數則為jobject. 一個例外是String類,其對應的類為jstring

 

Ljava/lang/String; String jstring
Ljava/net/Socket; Socket jobject

 

如果JAVA函式位於一個嵌入類,則用$作為類名間的分隔符。

例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"

相關文章