c++ java setobjectarrayelement_JNI(2) java与c++的参数传递

所有的本地方法的第一个参数都是指向JNIEnv结构的。这个结构是用来调用JNI函数的。第二个参数jclass的意义,要看方法是不是静态的(static)或者实例(Instance)的。前者,jclass代表一个类对象的引用,而后者是被调用的方法所属对象的引用。

1.返回值和参数类型根据等价约定映射到本地C/C++类型。有些类型,在本地代码中可直接使用,而其他类型只有通过JNI调用操作。

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

双浮点型数组

2.JNI通过JNIENV提供的方法操作Java数组。提供两个函数:一个是操作java的简单数据类型数组, 另一个操作对象数组。

存取Java简单类型的数组,使用GetXXXArrayElements函数,XXX代表了数组的类型。这个函数把Java数组看成参数,返回一个指向对应的本地类型的数组的指针。

对数组的存取完成后,要确保调用相应的ReleaseXXXArrayElements函数。

为了使用java对象的数组,使用GetObjectArrayElement函数和SetObjectArrayElement函数,分别去get,set数组的元素。GetArrayLength函数会返回数组的长度。

3.JNI通过JNIENV提供的方法操作Java对象。可以创建对象,get/set静态或实例的field,调用静态或实例的方法。JNI通过ID识别域和方法,进行上面的操作时,ID都是不可缺少的参数。

如果有了一个类的实例,就可以通过方法GetObjectClass得到这个类,如果没有类的实例,可以通过FindClass得到,参数是完整包路径+类名。

得到一个类后,通过NewObject方法可以创建这个类的实例。参数有两个,第一个为之前得到的jclass,第二个为这个类的构造方法的jmethodID。

函数

描述

GetFieldID

得到一个实例的域的ID

GetStaticFieldID

得到一个静态的域的ID

GetMethodID

得到一个实例的方法的ID

GetStaticMethodID

得到一个静态方法的ID

例子:

JNIEXPORT jobjectArray JNICALL Java_TestJCParam_getStructArray

(JNIEnv *env, jobject obj)

{

jclass objClass = (env)->FindClass("java/lang/Object");

jobjectArray args = (env)->NewObjectArray(5,objClass,0);

jclass objectClass = (env)->FindClass("com/DiskInfo");

jfieldID str = (env)->GetFieldID(objectClass,"name","Ljava/lang/String;");

jfieldID id = (env)->GetFieldID(objectClass,"serial","I");

for(int i=0;i<5;i++)

{

jmethodID jmid = env->GetMethodID(objectClass,"","()V");//得到jclass的构造方法的ID

jobject jo = env->NewObject(objectClass, jmid);//创建一个对象

jstring jstr = (env)->NewStringUTF("ni da ye !");

(env)->SetObjectField(jo,str,jstr);

(env)->SetIntField(jo,id,i);

(env)->SetObjectArrayElement(args,i,jo);

}

return args;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值