技术转载:Jni学习三:jni使用java对象详解

转载 2012年03月30日 10:50:14

一、 首先写了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、文件的前九行就不用说了,他们是CC++的头,应该很好理解。

       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,没有参数。  
  2. (DFZ[C)I 返回为int,参数为doublefloatchar[]   
  3. (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. /*  
  10.  * Class:     com_nedu_jni_helloword_HeaderFile  
  11.  * Method:    doInt  
  12.  * Signature: (DDD)I  
  13.  */ 
  14. JNIEXPORT jint JNICALL Java_com_nedu_jni_helloword_HeaderFile_doInt__DDD  
  15.   (JNIEnv *, <span style="color:#000000;background-color: rgb(255, 0, 0);">jclass</span>, jdouble, jdouble, jdouble); 

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

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

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

相关文章推荐

JNI jobject 与 map互转

//从c语言的map转java hashmap jobject JavaHelper::cmap2jhashmap(std::map cmap){ JNIEnv* env = JNU_GetEnv...

JNI技术2---本地代码反调用java类方法过程详解

记得在前面的JNI中我介绍了  在 java中调用本地代码的例子 ,这次 我就反过来   。 (如果初次接触JNI请看 JNI技术-1上篇文章) 首先我们在利用javah工具 生成 java类所对应...

Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能

JAVA的跨平台的特性深受java程序员们的喜爱,但正是由于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能,比如与一些硬件设备通信,往往要花费很大的精力去设计流程编...

使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能

JAVA的跨平台的特性深受java程序员们的喜爱,但正是由于它为了实现跨平台的目的,使得它和本地机器的各种内部联系变得很少,大大约束了它的功能,比如与一些硬件设备通信,往往要花费很大的精力去设计流程编...

使用JNI技术实现JAVA程序调用dll

原文:http://hi.baidu.com/dinguangx/blog/item/196560017e40e2031c95832f.html         JAVA的跨平台的特性深受java程序...

【Java Native】【JNI技术的实践(使用VS2010)】

因为现在平台的脚本都从C++迁移到java上来,我们需增加Java对-X读卡器的支持,但是-X读卡器并不是标准的PC/SC设备,里面包含了公司自己的通讯协议。因此我们不能使用现有的开源的jpcsc库来...

JNI学习笔记4——本地代码创建Java对象(包括javaString)

原文:http://blog.csdn.net/jiben071/archive/2010/11/26/6036305.aspx (一)在C/C++本地代码中创建JAVA对象1.java对象的创建(1...
  • GEOLO
  • GEOLO
  • 2011-04-22 10:20
  • 2295

JNI创建java对象

  • 2016-08-17 18:09
  • 1.46MB
  • 下载

Java通过JNI和c++对象互传

  • 2010-11-10 22:57
  • 98KB
  • 下载

学习android JNI的那些事儿--------6. 在java中传入引用数据类型(对象)作为参数

之前我们介绍过在java中传入一些基本数据类型作为参数在jni中的处理,这里我们来介绍下载java中传入我们自定义的一个对象作为参数。 我们先自定义一个class为student public c...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)