一、 首先写了java文件:
public class HeaderFile {
private native void doVoid();
native int doShort();
native void doArray(Object[] o );
native int doInt(int i); //byte ,short ,int,long,float,double ,boolean,char
native int doInt(double d); //byte ,short ,int,long,float,double ,boolean,char
native int doInt(Object o);
native int doInt(double d1,double d2);
static native int doInt(double d1 ,double d2,double d3);
static native int doInt(double d1 ,float f,boolean b ,char[] c );
native int doInt(int[] i);
native int doInt(int[] i1,double[] i2 );
static native int doInt(int[] i1,double[] i2 ,Object[] o );
public native String doString(String s);
public native Object doObject(Object o );
public native Enumeration doInterface(Iterator it);
public native Student doStudent(Student s);
// native int[] doInt(int[] i); //byte ,short ,int,long,float,double ,boolean,char
public native String[] doString(String[] s);
public native Object[] doObjects(Object[] o );
public native Enumeration[] doInterface(Iterator[] it);
public native Student[] doStudent(Student[] s);
public native static Object doAll(int[] i , String[] s , Student[] student );
}
java文件中包含了private、public、protect等类型的方法,static 方法和非static 方法,返回类型有基础类型、对象等。
二、下面看一下生成的头文件:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_nedu_jni_helloword_HeaderFile */
#ifndef _Included_com_nedu_jni_helloword_HeaderFile
#define _Included_com_nedu_jni_helloword_HeaderFile
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doVoid
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doVoid
(JNIEnv *, jobject);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doShort
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doShort
(JNIEnv *, jobject);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doArray
* Signature: ([Ljava/lang/Object;)V
*/
JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doArray
(JNIEnv *, jobject, jobjectArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInt
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__I
(JNIEnv *, jobject, jint);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInt
* Signature: (D)I
*/
JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__D
(JNIEnv *, jobject, jdouble);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInt
* Signature: (Ljava/lang/Object;)I
*/
JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__Ljava_lang_Object_2
(JNIEnv *, jobject, jobject);
/*
* 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);
/*
* 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);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInt
* Signature: (DFZ[C)I
*/
JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DFZ_3C
(JNIEnv *, jclass, jdouble, jfloat, jboolean, jcharArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInt
* Signature: ([I)I
*/
JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I
(JNIEnv *, jobject, jintArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInt
* Signature: ([I[D)I
*/
JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I_3D
(JNIEnv *, jobject, jintArray, jdoubleArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInt
* Signature: ([I[D[Ljava/lang/Object;)I
*/
JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I_3D_3Ljava_lang_Object_2
(JNIEnv *, jclass, jintArray, jdoubleArray, jobjectArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doString
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_nedu_jni_helloword_HeaderFile_doString__Ljava_lang_String_2
(JNIEnv *, jobject, jstring);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doObject
* Signature: (Ljava/lang/Object;)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doObject
(JNIEnv *, jobject, jobject);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInterface
* Signature: (Ljava/util/Iterator;)Ljava/util/Enumeration;
*/
JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInterface__Ljava_util_Iterator_2
(JNIEnv *, jobject, jobject);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doStudent
* Signature: (Lcom/nedu/jni/helloword/Student;)Lcom/nedu/jni/helloword/Student;
*/
JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doStudent__Lcom_nedu_jni_helloword_Student_2
(JNIEnv *, jobject, jobject);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doString
* Signature: ([Ljava/lang/String;)[Ljava/lang/String;
*/
JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doString___3Ljava_lang_String_2
(JNIEnv *, jobject, jobjectArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doObjects
* Signature: ([Ljava/lang/Object;)[Ljava/lang/Object;
*/
JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doObjects
(JNIEnv *, jobject, jobjectArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doInterface
* Signature: ([Ljava/util/Iterator;)[Ljava/util/Enumeration;
*/
JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInterface___3Ljava_util_Iterator_2
(JNIEnv *, jobject, jobjectArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doStudent
* Signature: ([Lcom/nedu/jni/helloword/Student;)[Lcom/nedu/jni/helloword/Student;
*/
JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doStudent___3Lcom_nedu_jni_helloword_Student_2
(JNIEnv *, jobject, jobjectArray);
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doAll
* Signature: ([I[Ljava/lang/String;[Lcom/nedu/jni/helloword/Student;)Ljava/lang/Object;
*/
JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doAll
(JNIEnv *, jclass, jintArray, jobjectArray, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
三、头文件分析如下:
1、文件的前九行就不用说了,他们是是C、C++的头,应该很好理解。
2、方法的注释部分,每个方法都有它的注释部分,这些都是相似的,对其中一个分析:
/*
* Class: com_nedu_jni_helloword_HeaderFile
* Method: doVoid
* Signature: ()V
*/
注释部分分为三部分Class、Method、Signature。
Class:表示Native方法的类名称。
Method:表示方法名称
Signature:是方法的标识,它是一个标识符,主要供我们在JNI操作java对象的方法使用的。
Signature一般是两部分构成,一个方法的参数,另一个是返回类型。方法参数在括号里面,返回类型在后面,
例如
()V 返回为void,没有参数。
(DFZ[C)I 返回为int,参数为double、float、char[]
(Ljava/lang/String;)Ljava/lang/String;返回String,参数为String
如果不清楚其中的字符含义,就不能知道其中的意思,其中字符对应有基本类型、对象类型、数组类型。分析如下
1)基本类型的对应关系如下:
2)方法参数或者返回值为java中的对象时,必须以“L”加上其路径,不过此路径必须以“/”分开,自定义的对象也使用本规则,不在包中时直接“L”加上类名称。比如说java.lang.String为“java/lang/String”,com.nedu.jni.helloword.Student为"com/nedu/jni/helloword/Student"
3)方法参数或者返回值为数组时类型前加上[,例如[I表示int[],[[[D表示 double[][][],即几维数组就加几个[。
看一下例子:
3、方法的声明
JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doArray(JNIEnv *,jobject,jobjectArray);
从上面的头文件可以看出方法基本有7部分组成。
1、3部分是都是JNI的关键字,表示此函数是要被JNI调用的。
2、表示方法的返回类型
4、为JNI中标识此方法来源于java的标识头
5、方法所在类的包名+类名
6、方法名
7、参数,它们有一个共同的特点,包含JNIEnv *――它是一个接口指针,用于定位函数表中的函数!
在JNI规范中一般称 为 “Interface Pointer”。看到这儿好像和过程调用很类似了!是的,JNI中
的操作过程,就是面向过程的!后面的jobject是 一个指向该类的指针,类似与C语言中的this。这个
第二个参数是变化的,当该方法为类的实例方法时该参数为jobject;当该方法为类方法(即静态方法)
时该参数为jclass,指向该类的class。
根据不同方法前缀生成的头文件比较如下:
1、static与非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);
/*
* 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);
第一个是非static方法,第二个是static方法,不同点如上红色标记。其中的不同将在以后提到。
2、 private、friendly、protected以及public这些方法限制符不会在JNI的头文件中出现。这些访问修饰符只有在其它类
使用这些方法时有效!JNI中不关心此修饰符!
/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*
*/
分享到:
相关推荐
android NDK 自动生成jni头文件 要所java 类自动生成jni调用头文件。
jni.h头文件,分享给需要的人,无法设置没有分数,只能选最低的了
学习JNI编译时,缺少的jni.h和jni_md.h头文件
AndroidJNI技术,最关键生成.h头文件的方法
Android JNI日志工具类,面去了每次手写android_print_info的繁琐写法,只需要导入头文件即可
一个AndroidStudio项目,通过CMakelist生成jni库文件(so),jni库文件通过头文件调用c编写的第三方库(so),文:https://blog.csdn.net/qq_35532751/article/details/78667984
speex for android jni编解码接口 mediacodec project 直接在android studio 上运行,生成静态libspeex.a 库 eu_siacs_conversations_liblivestream_audio_Speex.h 头文件 speex_jni.cpp 实现文件 speex.java 是...
学习JNI编译时,缺少的jni.h和jni_md.h头文件,Java调用C和C++函数时的JNI使用区别: 注意:jni.h头文件中对于***.c & ***.cpp采用不同的定义
Android虚拟机允许你的应用程序源代码通过JNI调用实现本地代码的方法,需要在应用程序中使用关键字native声明一个或多个方法表明该方法是通过本地调用实现的
JNI的两个头文件jni.h和jni_md.h,提供需要的人下载!!!!!
包含linuxx64和windowsx86下的jni.h和jni_md.h
JNI 静态注册 so 和 IDA 导入的 JNI.h 文件
Android jni基础知识, # This is a test examlpe foe android jni 1、实现一个android工程,在其Android.mk文件中不要定义jni相关的东西,代码中可以尽情的使用 2、使用mmm 命令编译该工程,能够编译成功的。...
在windows环境下的jni.h jni_md.h文件。 实际上是从jdk1.8安装完毕后,从文件夹下取得的。 jni.h在【jdk1.8.0_144\include】路径下。 jni_md.h在【jdk1.8.0_144\include\win32】路径下(linux版把win32换成linux...
NULL 博文链接:https://andyzhchy.iteye.com/blog/1287269
具有实现AES256位加密的C++代码,Application.mk Android.mk文件,JNI头文件和cpp文件。以及使用示例
————————————— ——————— ^ ^ 包名 类名 5. 编写相应的.c文件(hello-jni.c) #include #include<jni.h> JNIEXPORT jstring JNICALL Java_com_xxx_hello_HelloJni_stringFromJNI(JNIEnv *...
jni_dm.h 头文件下载
JNI开发之javah生成静态和非静态的两个头文件区别