Android JNI入门第三篇——jni头文件分析
一、 首先写了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 *, <span style="background-color: rgb(255, 0, 0);">jobject</span>, 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 *, <span style="color:#000000;background-color: rgb(255, 0, 0);">jclass</span>, jdouble, jdouble, jdouble);
第一个是非static方法,第二个是static方法,不同点如上红色标记。其中的不同将在以后提到。
2、 private、friendly、protected以及public这些方法限制符不会在JNI的头文件中出现。这些访问修饰符只有在其它类
使用这些方法时有效!JNI中不关心此修饰符!
/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*
*/
Android JNI入门第三篇——jni头文件分析的更多相关文章
- JavaMail入门第三篇 发送邮件
JavaMail API中定义了一个java.mail.Transport类,它专门用于执行邮件发送任务,这个类的实例对象封装了某种邮件发送协议的底层实施细节,应用程序调用这个类中的方法就可以把Mes ...
- Android JNI入门第六篇——C调用Java
本篇将介绍在JNI编程中C调用Java实现. 源码下载地址:http://download.csdn.net/detail/xyz_lmn/4868265 关键代码: java: public cla ...
- Android JNI入门第五篇——基本数据类型使用
前面讲到了java和native数据类型,这里就开始做一下使用: 第一步:新建工程 第二部:书写 java方法: public class NativeMethod { static { System ...
- Android JNI入门第四篇——Android.mk文件分析
ndroid.mk文件是在使用NDK编译C代码时必须的文件,Android.mk文件中描述了哪些C文件将被编译且指明了如何编译.掌握Android.mk文件的编写主要是掌握其里头将要使用的一些关键字, ...
- Html/Css(新手入门第三篇)
一.学习心得---参考优秀的网页来学习. 1我们只做的静态网页主要用的技术?html+css 只要网上看到的,他的源代码公开的.[1].先去分析,他们页面是如何布局(结构化)[2].再试着去做一下,- ...
- Java线程入门第三篇
Java内存模型(jmm) Why:保证多线程正确协同工作 看图说明: 文字解释:线程a和线程b通信过程,首先线程a把本地内存的共享变量更新到主内存中,然后线程b去读取主内存的共享变量,最后更新到自己 ...
- Visualforce入门第三篇_2017.3.2
Visualforce实现显示Record List(列表) 详细见链接:https://trailhead.salesforce.com/modules/visualforce_fundamenta ...
- Hadoop入门第三篇-MapReduce试手以及MR工作机制
MapReduce几个小应用 上篇文章已经介绍了怎么去写一个简单的MR并且将其跑起来,学习一个东西动手还是很有必要的,接下来我们就举几个小demo来体验一下跑起来的快感. demo链接请参照附件:ht ...
- JavaMail入门第四篇 接收邮件
上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操 ...
随机推荐
- Hadoop学习之Hadoop案例分析
一.日志数据分析1.背景1.1 ***论坛日志,数据分为两部分组成,原来是一个大文件,是56GB:以后每天生成一个文件,大约是150-200MB之间: 每行记录有5部分组成:1.访问ip:2.访问时间 ...
- Servlet基础知识(四)——Servlet过滤器Filter
一.什么是过滤器: 政府大楼的安检保安,它既能对进入政府大楼的人员进行检查,只允许检查符合要求的进入:同时他也负责对出大楼的人进行检查,看他带出的东西是否符合要求. 同样的,Servlet中的过滤器既 ...
- halcon与C#混合编程进阶版
这篇主要是C#和Halcon的混合编程,在此基础上对按键不同功能的划分,以及图片适应窗口和从本地打开图片. 新手来这里:http://www.cnblogs.com/badguy518/p/55150 ...
- 树的判断(poj nyoj hduoj)
题目: http://ac.jobdu.com/problem.php?pid=1481 http://acm.nyist.net/JudgeOnline/problem.php?pid=129 ht ...
- android 中获取网络状态、判断3G、2G、wifi网络、判断wifi是否打开、获取本机地址、获取本机串号IMEI整理
代码如下:package com.android.xym; import java.io.IOException; import java.net.HttpURLConnection; import ...
- Netty那点事: 概述, Netty中的buffer, Channel与Pipeline
Netty那点事(一)概述 Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户ne ...
- 经验分享:CSS浮动(float,clear)通俗讲解 太棒了,清晰明了
很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多 ...
- BZOJ 4518 [Sdoi2016]征途(分治DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4518 [题目大意] 给出一个数列,分成m段,求方差最小,答案乘上m的平方. [题解] ...
- HDU 5758 Explorer Bo(树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5758 [题目大意] 给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次 ...
- 经常使用的时间同步server地址
转载出处http://www.minunix.com/2013/03/ntpserver/ 感谢原作者,一切的权利都属于原作者,假设有所不适,我会马上删除 中国大概能用的NTP时间server地址 s ...


