没有合适的资源?快使用搜索试试~ 我知道了~
首页Jni中C++和Java的参数传递
资源详情
资源评论
资源推荐

如何使用 JNI 的一些基本方法和过程在网上多如牛毛,如果你对 Jni 不甚了解,不知道 Jni 是做什么的,
如何建立一个基本的 jni 程序,或许可以参考下面下面这些文章:
利用
VC++6.0
实现
JNI
的最简单的例子
JNI
入门教程之
HelloWorld
篇
SUN JNI Tutorial
这些资料的例子中,大多数只是输入一些简单的参数,获取没有参数。而在实际的使用过程中,往往需要
对参数进行处理转换。才可以被 C/C++程序识别。比如我们在 C++中有一个结构(Struct)DiskInfo ,需要
传递一个类似于 DiskInfo *pDiskInfo 的参数,类似于在 C++这样参数如何传递到 Java 中呢?下面我们就
来讨论 C++到 Java 中方法的一些常见参数的转换:
定义 Native Java 类:
如果你习惯了使用 JNI,你就不会觉得它难了。既然本地方法是由其他语言实现的,它们在 Java 中没有
函数体。但是,所有本地代码必须用本地关键词声明,成为 Java 类的成员。假设我们在 C++中有这么一
个结构,它用来描述硬盘信息:
//硬盘信息
struct""{
""""char"name[256];
""""int"serial;
}DiskInfo;
那么我们需要在 Java 中定义一个类来与之匹配,声明可以写成这样:
class"DiskInfo"{
""""//名字
""""public"String"name;
""""//序列号
""""public"int"serial;
}
在这个类中,申明一些 Native 的本地方法,来测试方法参数的传递,分别定义了一些函数,用来传递结
构或者结构数组,具体定义如下面代码:
/******************"定义本地方法 ********************/
""""//输入常用的数值类型(Boolean,Byte,Char,Short,Int,Float,Double)
""""public"native"void"displayParms(String"showText,"int"i,"boolean"bl);
""""//调用一个静态方法
""""public"native"int"add(int"a,"int"b);
""""//输入一个数组
""""public"native"void"setArray(boolean[]"blList);
""""//返回一个字符串数组

""""public"native"String[]"getStringArray();
""""//返回一个结构
""""public"native"DiskInfo"getStruct();
""""//返回一个结构数组
""""public"native"DiskInfo[]"getStructArray();
编译生成 C/C++头文件
定义好了 Java 类之后,接下来就要写本地代码。本地方法符号提供一个满足约定的头文件,使用 Java
工
具
Javah
可以很容易地创建它而不用手动去创建。你对 Java 的 class 文件使用 javah 命令,就会为你生成
一个对应的 C/C++头文件。
1、在控制台下进入工作路径,本工程路径为:E:\work\java\workspace\JavaJni。
2 、 运 行 javah 命 令 : javah -classpath E:\work\java\workspace\JavaJni com.sundy.jnidemo
ChangeMethodFromJni
本文生成的 C/C++头文件名为: com_sundy_jnidemo_ChangeMethodFromJni.h"
在 C/C++中实现本地方法
生成 C/C++头文件之后,你就需要写头文件对应的本地方法。注意:所有的本地方法的第一个参数都是指
向 JNIEnv 结构的。这个结构是用来调用 JNI 函数的。第二个参数 jclass 的意义,要看方法是不是静态的
(static)或者实例(Instance)的。前者,jclass 代表一个类对象的引用,而后者是被调用的方法所属对
象的引用。
返回值和参数类型根据等价约定映射到本地 C/C++类型,如表 JNI 类型映射所示。有些类型,在本地代码
中可直接使用,而其他类型只有通过 JNI 调用操作。
表 A
Java 类型 本地类型 描述
boolean jboolean
C/C++8 位整型
byte jbyte
C/C++带符号的 8 位整型
char jchar
C/C++无符号的 16 位整型
short jshort
C/C++带符号的 16 位整型
int jint
C/C++带符号的 32 位整型
long jlong
C/C++带符号的 64 位整型 e
float jfloat
C/C++32 位浮点型
double jdouble
C/C++64 位浮点型
Object jobject
任何 Java 对象,或者没有对应 java 类型的对象
Class jclass
Class 对象
String jstring
字符串对象
Object[] jobjectArray
任何对象的数组

boolean[] jbooleanArray
布尔型数组
byte[] jbyteArray
比特型数组
char[] jcharArray
字符型数组
short[] jshortArray
短整型数组
int[] jintArray
整型数组
long[] jlongArray
长整型数组
float[] jfloatArray
浮点型数组
double[] jdoubleArray
双浮点型数组
※"""" JNI 类型映射
使用数组:
JNI 通过 JNIEnv 提供的操作 Java 数组的功能。它提供了两个函数:一个是操作 java 的简单型数组的,另
一个是操作对象类型数组的。
因为速度的原因,简单类型的数组作为指向本地类型的指针暴露给本地代码。因此,它们能作为常规的数
组存取。这个指针是指向实际的 Java 数组或者 Java 数组的拷贝的指针。另外,数组的布置保证匹配本地
类型。
为了存取 Java 简单类型的数组,你就要要使用 GetXXXArrayElements 函数(见表 B),XXX 代表了数
组的类型。这个函数把 Java 数组看成参数,返回一个指向对应的本地类型的数组的指针。
表 B
函数 Java 数组类型 本地类型
GetBooleanArrayElements jbooleanArray jboolean
GetByteArrayElements jbyteArray jbyte
GetCharArrayElements jcharArray jchar
GetShortArrayElements jshortArray jshort
GetIntArrayElements jintArray jint
GetLongArrayElements jlongArray jlong
GetFloatArrayElements jfloatArray jfloat
GetDoubleArrayElements jdoubleArray jdouble
JNI 数组存取函数
当你对数组的存取完成后,要确保调用相应的 ReleaseXXXArrayElements 函数,参数是对应 Java 数组和
GetXXXArrayElements 返回的指针。如果必要的话,这个释放函数会复制你做的任何变化(这样它们就
反射到 java 数组),然后释放所有相关的资源。
为了使用 java 对象的数组,你必须使用 GetObjectArrayElement 函数和 SetObjectArrayElement 函数,分
别去 get,set 数组的元素。GetArrayLength 函数会返回数组的长度。
使用对象
剩余11页未读,继续阅读


















安全验证
文档复制为VIP权益,开通VIP直接复制

评论1