一、 首先写了java文件:

  1. public class HeaderFile {
  2. private native void  doVoid();
  3. native int doShort();
  4. native void doArray(Object[] o );
  5. native int doInt(int i);      //byte ,short ,int,long,float,double ,boolean,char
  6. native int doInt(double d);    //byte ,short ,int,long,float,double ,boolean,char
  7. native int doInt(Object o);
  8. native int doInt(double d1,double d2);
  9. static native int doInt(double d1 ,double d2,double d3);
  10. static native int doInt(double d1 ,float f,boolean b ,char[] c );
  11. native int doInt(int[] i);
  12. native int doInt(int[] i1,double[] i2 );
  13. static native int doInt(int[] i1,double[] i2 ,Object[] o );
  14. public native String doString(String s);
  15. public native Object doObject(Object o );
  16. public native Enumeration doInterface(Iterator it);
  17. public native Student doStudent(Student s);
  18. //  native int[] doInt(int[] i);  //byte ,short ,int,long,float,double ,boolean,char
  19. public native String[] doString(String[] s);
  20. public native Object[] doObjects(Object[] o );
  21. public native Enumeration[] doInterface(Iterator[] it);
  22. public native Student[] doStudent(Student[] s);
  23. public native static Object doAll(int[] i , String[] s , Student[] student );
  24. }

java文件中包含了private、public、protect等类型的方法,static 方法和非static 方法,返回类型有基础类型、对象等。

二、下面看一下生成的头文件:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class com_nedu_jni_helloword_HeaderFile */
  4. #ifndef _Included_com_nedu_jni_helloword_HeaderFile
  5. #define _Included_com_nedu_jni_helloword_HeaderFile
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     com_nedu_jni_helloword_HeaderFile
  11. * Method:    doVoid
  12. * Signature: ()V
  13. */
  14. JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doVoid
  15. (JNIEnv *, jobject);
  16. /*
  17. * Class:     com_nedu_jni_helloword_HeaderFile
  18. * Method:    doShort
  19. * Signature: ()I
  20. */
  21. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doShort
  22. (JNIEnv *, jobject);
  23. /*
  24. * Class:     com_nedu_jni_helloword_HeaderFile
  25. * Method:    doArray
  26. * Signature: ([Ljava/lang/Object;)V
  27. */
  28. JNIEXPORT void JNICALL Java_com_nedu_jni_helloword_HeaderFile_doArray
  29. (JNIEnv *, jobject, jobjectArray);
  30. /*
  31. * Class:     com_nedu_jni_helloword_HeaderFile
  32. * Method:    doInt
  33. * Signature: (I)I
  34. */
  35. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__I
  36. (JNIEnv *, jobject, jint);
  37. /*
  38. * Class:     com_nedu_jni_helloword_HeaderFile
  39. * Method:    doInt
  40. * Signature: (D)I
  41. */
  42. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__D
  43. (JNIEnv *, jobject, jdouble);
  44. /*
  45. * Class:     com_nedu_jni_helloword_HeaderFile
  46. * Method:    doInt
  47. * Signature: (Ljava/lang/Object;)I
  48. */
  49. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__Ljava_lang_Object_2
  50. (JNIEnv *, jobject, jobject);
  51. /*
  52. * Class:     com_nedu_jni_helloword_HeaderFile
  53. * Method:    doInt
  54. * Signature: (DD)I
  55. */
  56. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DD
  57. (JNIEnv *, jobject, jdouble, jdouble);
  58. /*
  59. * Class:     com_nedu_jni_helloword_HeaderFile
  60. * Method:    doInt
  61. * Signature: (DDD)I
  62. */
  63. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DDD
  64. (JNIEnv *, jclass, jdouble, jdouble, jdouble);
  65. /*
  66. * Class:     com_nedu_jni_helloword_HeaderFile
  67. * Method:    doInt
  68. * Signature: (DFZ[C)I
  69. */
  70. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DFZ_3C
  71. (JNIEnv *, jclass, jdouble, jfloat, jboolean, jcharArray);
  72. /*
  73. * Class:     com_nedu_jni_helloword_HeaderFile
  74. * Method:    doInt
  75. * Signature: ([I)I
  76. */
  77. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I
  78. (JNIEnv *, jobject, jintArray);
  79. /*
  80. * Class:     com_nedu_jni_helloword_HeaderFile
  81. * Method:    doInt
  82. * Signature: ([I[D)I
  83. */
  84. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I_3D
  85. (JNIEnv *, jobject, jintArray, jdoubleArray);
  86. /*
  87. * Class:     com_nedu_jni_helloword_HeaderFile
  88. * Method:    doInt
  89. * Signature: ([I[D[Ljava/lang/Object;)I
  90. */
  91. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt___3I_3D_3Ljava_lang_Object_2
  92. (JNIEnv *, jclass, jintArray, jdoubleArray, jobjectArray);
  93. /*
  94. * Class:     com_nedu_jni_helloword_HeaderFile
  95. * Method:    doString
  96. * Signature: (Ljava/lang/String;)Ljava/lang/String;
  97. */
  98. JNIEXPORT jstring JNICALL Java_com_nedu_jni_helloword_HeaderFile_doString__Ljava_lang_String_2
  99. (JNIEnv *, jobject, jstring);
  100. /*
  101. * Class:     com_nedu_jni_helloword_HeaderFile
  102. * Method:    doObject
  103. * Signature: (Ljava/lang/Object;)Ljava/lang/Object;
  104. */
  105. JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doObject
  106. (JNIEnv *, jobject, jobject);
  107. /*
  108. * Class:     com_nedu_jni_helloword_HeaderFile
  109. * Method:    doInterface
  110. * Signature: (Ljava/util/Iterator;)Ljava/util/Enumeration;
  111. */
  112. JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInterface__Ljava_util_Iterator_2
  113. (JNIEnv *, jobject, jobject);
  114. /*
  115. * Class:     com_nedu_jni_helloword_HeaderFile
  116. * Method:    doStudent
  117. * Signature: (Lcom/nedu/jni/helloword/Student;)Lcom/nedu/jni/helloword/Student;
  118. */
  119. JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doStudent__Lcom_nedu_jni_helloword_Student_2
  120. (JNIEnv *, jobject, jobject);
  121. /*
  122. * Class:     com_nedu_jni_helloword_HeaderFile
  123. * Method:    doString
  124. * Signature: ([Ljava/lang/String;)[Ljava/lang/String;
  125. */
  126. JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doString___3Ljava_lang_String_2
  127. (JNIEnv *, jobject, jobjectArray);
  128. /*
  129. * Class:     com_nedu_jni_helloword_HeaderFile
  130. * Method:    doObjects
  131. * Signature: ([Ljava/lang/Object;)[Ljava/lang/Object;
  132. */
  133. JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doObjects
  134. (JNIEnv *, jobject, jobjectArray);
  135. /*
  136. * Class:     com_nedu_jni_helloword_HeaderFile
  137. * Method:    doInterface
  138. * Signature: ([Ljava/util/Iterator;)[Ljava/util/Enumeration;
  139. */
  140. JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInterface___3Ljava_util_Iterator_2
  141. (JNIEnv *, jobject, jobjectArray);
  142. /*
  143. * Class:     com_nedu_jni_helloword_HeaderFile
  144. * Method:    doStudent
  145. * Signature: ([Lcom/nedu/jni/helloword/Student;)[Lcom/nedu/jni/helloword/Student;
  146. */
  147. JNIEXPORT jobjectArray JNICALL Java_com_nedu_jni_helloword_HeaderFile_doStudent___3Lcom_nedu_jni_helloword_Student_2
  148. (JNIEnv *, jobject, jobjectArray);
  149. /*
  150. * Class:     com_nedu_jni_helloword_HeaderFile
  151. * Method:    doAll
  152. * Signature: ([I[Ljava/lang/String;[Lcom/nedu/jni/helloword/Student;)Ljava/lang/Object;
  153. */
  154. JNIEXPORT jobject JNICALL Java_com_nedu_jni_helloword_HeaderFile_doAll
  155. (JNIEnv *, jclass, jintArray, jobjectArray, jobjectArray);
  156. #ifdef __cplusplus
  157. }
  158. #endif
  159. #endif

三、头文件分析如下:

1、文件的前九行就不用说了,他们是是C、C++的头,应该很好理解。

2、方法的注释部分,每个方法都有它的注释部分,这些都是相似的,对其中一个分析:

  1. /*
  2. * Class:     com_nedu_jni_helloword_HeaderFile
  3. * Method:    doVoid
  4. * Signature: ()V
  5. */

注释部分分为三部分Class、Method、Signature。

Class:表示Native方法的类名称。

Method:表示方法名称

Signature:是方法的标识,它是一个标识符,主要供我们在JNI操作java对象的方法使用的。

Signature一般是两部分构成,一个方法的参数,另一个是返回类型。方法参数在括号里面,返回类型在后面,

例如

  1. ()V 返回为void,没有参数。
  1. (DFZ[C)I 返回为int,参数为double、float、char[]
  1. (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、方法的声明

  1. 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的比较:

  1. /*
  2. * Class:     com_nedu_jni_helloword_HeaderFile
  3. * Method:    doInt
  4. * Signature: (DD)I
  5. */
  6. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DD
  7. (JNIEnv *, <span style="background-color: rgb(255, 0, 0);">jobject</span>, jdouble, jdouble);
  8. /*
  9. * Class:     com_nedu_jni_helloword_HeaderFile
  10. * Method:    doInt
  11. * Signature: (DDD)I
  12. */
  13. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DDD
  14. (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头文件分析的更多相关文章

  1. JavaMail入门第三篇 发送邮件

    JavaMail API中定义了一个java.mail.Transport类,它专门用于执行邮件发送任务,这个类的实例对象封装了某种邮件发送协议的底层实施细节,应用程序调用这个类中的方法就可以把Mes ...

  2. Android JNI入门第六篇——C调用Java

    本篇将介绍在JNI编程中C调用Java实现. 源码下载地址:http://download.csdn.net/detail/xyz_lmn/4868265 关键代码: java: public cla ...

  3. Android JNI入门第五篇——基本数据类型使用

    前面讲到了java和native数据类型,这里就开始做一下使用: 第一步:新建工程 第二部:书写 java方法: public class NativeMethod { static { System ...

  4. Android JNI入门第四篇——Android.mk文件分析

    ndroid.mk文件是在使用NDK编译C代码时必须的文件,Android.mk文件中描述了哪些C文件将被编译且指明了如何编译.掌握Android.mk文件的编写主要是掌握其里头将要使用的一些关键字, ...

  5. Html/Css(新手入门第三篇)

    一.学习心得---参考优秀的网页来学习. 1我们只做的静态网页主要用的技术?html+css 只要网上看到的,他的源代码公开的.[1].先去分析,他们页面是如何布局(结构化)[2].再试着去做一下,- ...

  6. Java线程入门第三篇

    Java内存模型(jmm) Why:保证多线程正确协同工作 看图说明: 文字解释:线程a和线程b通信过程,首先线程a把本地内存的共享变量更新到主内存中,然后线程b去读取主内存的共享变量,最后更新到自己 ...

  7. Visualforce入门第三篇_2017.3.2

    Visualforce实现显示Record List(列表) 详细见链接:https://trailhead.salesforce.com/modules/visualforce_fundamenta ...

  8. Hadoop入门第三篇-MapReduce试手以及MR工作机制

    MapReduce几个小应用 上篇文章已经介绍了怎么去写一个简单的MR并且将其跑起来,学习一个东西动手还是很有必要的,接下来我们就举几个小demo来体验一下跑起来的快感. demo链接请参照附件:ht ...

  9. JavaMail入门第四篇 接收邮件

    上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操 ...

随机推荐

  1. java——数据库——commons-DbUtils

    Apache Commons DbUtils Tutorial The Apache Commons DbUtils library is a small set of classes designe ...

  2. Hbase Region Server 启动失败

    错误如下:Master rejected startup because clock is out of sync org.apache.hadoop.hbase.ClockOutOfSyncExce ...

  3. 【Android】Handler的应用(一):从服务器端加载JSON数据

    最终目的 以JSON的形式,将数据存入服务器端. 在Android中,以Handler加载显示大批量文字. 在此以加载金庸小说<天龙八部(新修版)>为例(2580480 字节). 以tom ...

  4. codeforces 617E. XOR and Favorite Number 莫队

    题目链接 给n个数, m个询问, 每次询问问你[l, r]区间内有多少对(i, j), 使得a[i]^a[i+1]^......^a[j]结果为k. 维护一个前缀异或值就可以了. 要注意的是 区间[l ...

  5. ios 刷新BUG

    UItextView edited = yes  ; 导致 刷新奇怪: 有些方法不要自己调用: 可能会破坏组件自己的生命周期: 建议模块化开发组件,自己处理自己的事:

  6. VB.NET版机房收费系统---SqlHelper

    SqlHelper,最早接触这个词儿的时候,好像是13年的暑假,那个夏天来的比往年来的稍晚一些,呵呵,sqlhelper,翻译成中文就是数据库助手,帮手.百度百科这样对她进行阐述: SqlHelper ...

  7. STL中主要的算法(一)

    一.replace() 替换算法将指定元素值替换为新值,使用原型例如以下,将迭代器[first,last)中值为old_value的元素所有替换为new_value值. 函数原型: template  ...

  8. js中if的简写方法

    http://transitions1020.com/# 太帅! <script type="text/javascript"> 如果你想写 if (!false) { ...

  9. FMDB 直接将查询结果转化为字典

    今天学习FMDB框架,发现非常好用的一点,就是就以把查询结果直接转化为字典 NSString *querySql = @"select * from stuInfo"; NSMut ...

  10. JavaScript使用button提交表单

    <form action="test.html" method="POST"> <input type="button" ...