2019独角兽企业重金招聘Python工程师标准>>>
一个数组int[],就需要表示为这样"[I"。如果多个数组double[][][]就需要表示为这样 "[[[D"。也就是说每一个方括号开始,就表示一个数组维数。多个方框后面,就是数组 的类型。
Java 类型 | 符号 |
Boolean | Z |
Byte | B |
Char | C |
Short | 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
依次类推
C和C++函数时的JNI使用区别
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);