转载请标明出处:
http://blog.csdn.net/michael1112/article/details/56666407

江东橘子的博客

一、 首先写了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(Objects 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[] doSdudent(Student[] s);

    public native static Object doAll(int[] i , String[] s , Student[] student );

}

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

HeaderFile中用到的Student 类我们新建一个Student类

public class Student {private  String name;
    private String sex;
}

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

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_jdjz_myapplication_HeaderFile */

#ifndef _Included_com_jdjz_myapplication_HeaderFile
#define _Included_com_jdjz_myapplication_HeaderFile
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doVoid
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_jdjz_myapplication_HeaderFile_doVoid(JNIEnv *, jobject);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doShort
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doShort(JNIEnv *, jobject);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doArray
 * Signature: ([Ljava/lang/Object;)V
 */
JNIEXPORT void JNICALL Java_com_jdjz_myapplication_HeaderFile_doArray(JNIEnv *, jobject, jobjectArray);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt__I(JNIEnv *, jobject, jint);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: (D)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt__D(JNIEnv *, jobject, jdouble);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: (Ljava/util/Objects;)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt__Ljava_util_Objects_2(JNIEnv *, jobject, jobject);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: (DD)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt__DD(JNIEnv *, jobject, jdouble, jdouble);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: (DDD)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt__DDD(JNIEnv *, jclass, jdouble, jdouble, jdouble);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: (DFZ[C)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt__DFZ_3C(JNIEnv *, jclass, jdouble, jfloat, jboolean, jcharArray);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: ([I)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt___3I(JNIEnv *, jobject, jintArray);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: ([I[D)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt___3I_3D(JNIEnv *, jobject, jintArray, jdoubleArray);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: ([I[D[Ljava/lang/Object;)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt___3I_3D_3Ljava_lang_Object_2(JNIEnv *, jclass, jintArray, jdoubleArray, jobjectArray);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doString
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_jdjz_myapplication_HeaderFile_doString(JNIEnv *, jobject, jstring);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doObject
 * Signature: (Ljava/lang/Object;)Ljava/lang/Object;
 */
JNIEXPORT jobject JNICALL Java_com_jdjz_myapplication_HeaderFile_doObject(JNIEnv *, jobject, jobject);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInterface
 * Signature: ([Ljava/util/Iterator;)[Ljava/util/Enumeration;
 */
JNIEXPORT jobjectArray JNICALL Java_com_jdjz_myapplication_HeaderFile_doInterface(JNIEnv *, jobject, jobjectArray);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doSdudent
 * Signature: ([Lcom/jdjz/myapplication/Student;)[Lcom/jdjz/myapplication/Student;
 */
JNIEXPORT jobjectArray JNICALL Java_com_jdjz_myapplication_HeaderFile_doSdudent(JNIEnv *, jobject, jobjectArray);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doAll
 * Signature: ([I[Ljava/lang/String;[Lcom/jdjz/myapplication/Student;)Ljava/lang/Object;
 */
JNIEXPORT jobject JNICALL Java_com_jdjz_myapplication_HeaderFile_doAll(JNIEnv *, jclass, jintArray, jobjectArray, jobjectArray);

#ifdef __cplusplus
}
#endif
#endif

三、头文件分析如下:

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

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

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doVoid
 * Signature: ()V
 */

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

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

Method:表示方法名称

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

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

例如

如果不清楚其中的字符含义,就不能知道其中的意思,其中字符对应有基本类型、对象类型、数组类型。分析如下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、方法的声明

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doArray
 * Signature: ([Ljava/lang/Object;)V
 */
JNIEXPORT void JNICALL Java_com_jdjz_myapplication_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_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: (DD)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt__DD(JNIEnv *, jobject, jdouble, jdouble);

/*
 * Class:     com_jdjz_myapplication_HeaderFile
 * Method:    doInt
 * Signature: (DDD)I
 */
JNIEXPORT jint JNICALL Java_com_jdjz_myapplication_HeaderFile_doInt__DDD(JNIEnv *, jclass, jdouble, jdouble, jdouble);

第一个是非static方法,第二个是static方法,不同点如上红色标记。其中的不同将在以后提到。

2、private、friendly、protected以及public这些方法限制符不会在JNI的头文件中出现。这些访问修饰符只有在其它类

使用这些方法时有效!JNI中不关心此修饰符!

/**
* @author 江东橘子
* 邮箱:whtchl@126.com
*/

Android JNI入门第四篇——jni头文件分析相关推荐

  1. java邮件接收代码,JavaMail入门第四篇 接收邮件(示例代码)

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

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

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

  3. Android JNI入门第五篇——Android.mk分析

    转载请标明出处: http://blog.csdn.net/michael1112/article/details/56671708 江东橘子的博客 Android.mk文件是在使用NDK编译C代码时 ...

  4. 如何高效运作机器学习团队(机器学习入门第四篇)

    本文是机器学习入门教程的第四篇,前三篇分别是: 1.机器学习能为你的业务做什么?有些事情你肯定猜不到 2.关于机器学习算法 你需要了解的东西 3.如何开发机器学习模型? 我们已经讨论了开发机器学习模型 ...

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

    前面讲到了java和native数据类型,这里就开始做一下使用: 第一步:新建工程 第二部:书写 java方法: [java] view plaincopyprint? public class Na ...

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

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

  7. Android JNI入门第七篇——C调用Java

    关键代码: java: [java] view plaincopy print? public class CCallJava { public static String getTime() { L ...

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

    转载请标明出处: http://blog.csdn.net/michael1112/article/details/56672288 江东橘子的博客 前面讲到了Java和native数据类型,这里就开 ...

  9. Avalonia跨平台入门第四篇之Popup在uos下问题

    上一篇简单玩耍了Popup,这不正当我洋洋自得的时候前线传来战报:你家伙做的效果在UOS下面有问题;然后直接发来一张捷报: 明明在乌班图和优麒麟都没啥问题,单单就你这个UOS牛,结果发现个神奇的特效: ...

最新文章

  1. 菜鸟学iPhone开发-计算器实例(实现篇)
  2. pandas使用to_sql方法将dataframe注册为数据库表进行数据整合和数据清洗并不对比SQL操作和dataframe操作
  3. JavaScript基础——处理字符串
  4. c语言中int*point 其中point是指针变量名,2012年计算机等级二级C语言章节习题及答案(9)...
  5. http各种中的各种timeout
  6. 前端学习(2815):小程序学习之开发者工具介绍
  7. 矩阵相乘Java版(第一个java程序)
  8. 笑着学会Linux 系统之故障排查
  9. jrtplib的编译方法
  10. mysql oracle 左链接_mysql左连接与oracle(+)使用对照
  11. ubuntu14.04 出现symbol lookup error
  12. MyBatis中拦截器(Interceptor)实现原理分析
  13. XPS笔记本及各类超薄笔记本的白果网卡安装教程
  14. 线路规划实现用java_北京地铁出行线路规划系统项目总结(Java+Flask+Vue实现)
  15. 计算机图解教程视频教程,超详细图文+视频电脑组装教程,装机之家手把手教你组装一台电脑(9)...
  16. java poi 操作word遇到的问题
  17. Boundary Regularized Convolutional Neural Network for Layer Parsing of Breast Anatomy in ABUS
  18. 数据链路层-点对点通信方式
  19. Python Lost connection to MySQL server during query
  20. Node模块引入与加载机制

热门文章

  1. java ios支付接口开发_微信支付接入(Android/IOS(swift)/Java后台)
  2. linux 定位 踩内存_运维必备的问题定位工具及案例分析
  3. freebasic 编译linux,免费BASIC编译器下载
  4. 3dvary灯光材质为什么不亮_夜间跑高速开近光灯与为什么近光灯和刹车泡容易坏。...
  5. 20分钟学会CMake
  6. opencv线结构光三维重建
  7. python redis 消息队列_python中利用redis构建任务队列(queue)
  8. go打造以太坊合约测试框架
  9. AS莫名报错 Error:Could not download junit.jar (junit:junit:4.12): No cached version available
  10. 12-C语言排序算法