编写Java文件
|
|
生成头文件
|
|
头文件分析
方法注释
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doVoid
* Signature: ()V
*/
Class:表示Native方法的类名称
Method:表示方法名称
Signature:是方法的标识,主要提供我们再JNI操作java对象中使用
Signature一般 是两部分构成,一个方法的参数。另一个是返回类型。方法参数在括号里面,返回类型在后面,例如:
()V
返回值为void,没有参数。
(DFZ[C)I
返回值为int,参数为double、float、char[]
(Ljava/lang/String;)Ljava/lang/String;
返回值String,参数为String
- 基本类型的对应关系如下
方法参数或者返回值为java中的对象时,必须以“L”加上其路径,次路径必须以”/“分开,自定义的对象也使用本规则,不在包中时直接”L”,比如说java.lang.String为“java/lang/String”,com.nedu.jni.helloword.Student为”com/nedu/jni/helloword/Student”
方法)方法参数或者返回值为数组时类型前加上[,例如[I表示int[],[[[D表示 double[][][],即几维数组就加几个[。例子如下:
方法的声明
|
|
从声明可以看出方法基本由7部分组成:
- JNIEXPORT是JNI的关键字,表示此函数时要被JNI调用的
- void表示方法的返回值类型
- JNICALL是JNI的关键字,表示此函数时要被JNI调用的
- Java_为JNI中表示此方法来源于java的标志头
- com_nedu_jni_helloword_HeaderFile表示方法所在的包名+类名
- doArray表示方法名
- 参数:JNIEnv*是一个接口指针,用于定位函数表中的函数,后面的jobject是 一个指向该类的指针,类似与C语言中的this。这个第二个参数是变化的,当该方法为类的实例方法时该参数为jobject;当该方法为类方法(即静态方法)时该参数为jclass,指向该类的class。
根据不同方法前缀生成的头文件比较如下:
static与非static的比较
123456789101112131415/* 非static方法* Class: com_nedu_jni_helloword_HeaderFile* Method: doInt* Signature: (DD)I*/JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DD(JNIEnv *, jobject, jdouble, jdouble);/* static方法* Class: com_nedu_jni_helloword_HeaderFile* Method: doInt* Signature: (DDD)I*/JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DDD(JNIEnv *, jclass, jdouble, jdouble, jdouble);private、friendly、protected以及public这些方法限制符不会在JNI的头文件中出现。这些访问修饰符只有在其它类使用这些方法时有效!JNI中不关心此修饰符!