一个数组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);