一個數組int[],就須要表示爲這樣"[I"。若是多個數組double[][][]就須要表示爲這樣 "[[[D"。也就是說每個方括號開始,就表示一個數組維數。多個方框後面,就是數組 的類型。java
Java 類型android |
符號c++ |
Boolean數組 |
Z函數 |
Bytespa |
B指針 |
Char對象 |
Cci |
Shorttable |
S |
Int |
I |
Long |
J |
Float |
F |
Double |
D |
Void |
V |
objects對象 |
以"L"開頭,以";"結尾,中間是用"/" 隔開的包及類名。好比:Ljava/lang/String;若是是嵌套類,則用$來表示嵌套。例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z" |
例如:
java c/c++
int[] [I
boolean[][] [[Z
void fun() (;)V
void fun(int) (I;)V
long fun(int, String) (ILjava/lang/String;)J
int[] fun(int[]) ([I;)I
依次類推
Java調用C和C++函數時的JNI使用區別:
注意:jni.h頭文件中對於*.c & *.cpp採用不一樣的定義
在C的定義中,env是一個兩級指針,而在C++的定義中,env是個一級指針
C形式須要對env指針進行雙重deferencing,並且須將env做爲第一個參數傳給jni函數
對於.c
1.jclass test_class = (env)->GetObjectClass(env, obj);
2.jfieldID id_num = (env)->GetFieldID(env, test_class, "num", "I");
對於 .cpp 1.jclass test_class = env->GetObjectClass(obj); 2.jfieldID id_num = env->GetFieldID(test_class, "num", "I"); 在 C 中, JNI 函數調用由「(env)->」做前綴,目的是爲了取出函數指針所引用的值。 在 C++ 中, JNIEnv 類擁有處理函數指針查找的內聯成員函數。 下面將說明這個細微的差別,其中,這兩行代碼訪問同一函數,但每種語言都有各自的語法。 C 語法:jsize len = (env)->GetArrayLength(env,array); C++ 語法:jsize len =env->GetArrayLength(array);