欢迎来到天天文库
浏览记录
ID:34723945
大小:65.26 KB
页数:12页
时间:2019-03-10
《jni中c和java的参数传递》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Jni中C++和Java的参数传递如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用VC++6.0实现JNI的最简单的例子JNI入门教程之HelloWorld篇SUNJNITutorial这些资料的例子中,大多数只是输入一些简单的参数,获取没有参数。而在实际的使用过程中,往往需要对参数进行处理转换。才可以被C/C++程序识别。比如我们在C++中有一个结构(Struct)DiskInfo,需要传递一个类似于DiskInfo*pDiskInfo
2、的参数,类似于在C++这样参数如何传递到Java中呢?下面我们就来讨论C++到Java中方法的一些常见参数的转换:定义NativeJava类:如果你习惯了使用JNI,你就不会觉得它难了。既然本地方法是由其他语言实现的,它们在Java中没有函数体。但是,所有本地代码必须用本地关键词声明,成为Java类的成员。假设我们在C++中有这么一个结构,它用来描述硬盘信息://硬盘信息struct{charname[256];intserial;}DiskInfo;那么我们需要在Java中定义一个类来与之匹配,声明可以写成这样:classDiskInfo{//名字
3、publicStringname;//序列号publicintserial;}在这个类中,申明一些Native的本地方法,来测试方法参数的传递,分别定义了一些函数,用来传递结构或者结构数组,具体定义如下面代码:/**//******************定义本地方法********************///输入常用的数值类型(Boolean,Byte,Char,Short,Int,Float,Double)publicnativevoiddisplayParms(StringshowText,inti,booleanbl);//调用一个静态方法
4、publicnativeintadd(inta,intb);//输入一个数组publicnativevoidsetArray(boolean[]blList);//返回一个字符串数组publicnativeString[]getStringArray();//返回一个结构publicnativeDiskInfogetStruct();//返回一个结构数组publicnativeDiskInfo[]getStructArray();编译生成C/C++头文件定义好了Java类之后,接下来就要写本地代码。本地方法符号提供一个满足约定的头文件,使用Java工
5、具Javah可以很容易地创建它而不用手动去创建。你对Java的class文件使用javah命令,就会为你生成一个对应的C/C++头文件。1、在控制台下进入工作路径,本工程路径为:E:workjavaworkspaceJavaJni。2、运行javah命令:javah-classpathE:workjavaworkspaceJavaJnicom.sundy.jnidemoChangeMethodFromJni本文生成的C/C++头文件名为:com_sundy_jnidemo_ChangeMethodFromJni.h在C/C++中实现本
6、地方法生成C/C++头文件之后,你就需要写头文件对应的本地方法。注意:所有的本地方法的第一个参数都是指向JNIEnv结构的。这个结构是用来调用JNI函数的。第二个参数jclass的意义,要看方法是不是静态的(static)或者实例(Instance)的。前者,jclass代表一个类对象的引用,而后者是被调用的方法所属对象的引用。返回值和参数类型根据等价约定映射到本地C/C++类型,如表JNI类型映射所示。有些类型,在本地代码中可直接使用,而其他类型只有通过JNI调用操作。表AJava类型本地类型描述booleanjbooleanC/C++8位整型by
7、tejbyteC/C++带符号的位整型charjcharC/C++无符号的位整型shortjshortC/C++带符号的位整型intjintC/C++带符号的位整型longjlongC/C++带符号的位整型efloatjfloatC/C++32位浮点型doublejdoubleC/C++64位浮点型Objectjobject任何Java对象,或者没有对应java类型的对象ClassjclassClass对象Stringjstring字符串对象Object[]jobjectArray任何对象的数组boolean[]jbooleanArray布尔型数组b
8、yte[]jbyteArray比特型数组char[]jcharArray字符型数组short[]jshort
此文档下载收益归作者所有