JNI基础(5): JNI中引用类型

2022-01-11  本文已影响0人  MemetGhini

JNI中数据类型分为两种,一种是基础数据类型,另一种是引用类型。在调用Java native方法将实参传递给C/C++函数的时候,会自动将java形参的数据类型自动转换成C/C++相应的数据类型,所以我们在写JNI程序的时候,必须要明白它们之间数据类型的对应关系。下面先介绍引用类型。

引用类型包括:类,实例,数组。引用类型的映射参见下表:

Java类型 JNI类型 描述
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 双浮点型数组
特殊类型: void void 没有返回值

java String数组中获取最后一个元素:

//先获取数组长度
int len = env->GetArrayLength(str_arry);
//获取某个元素
jstring str1 = (jstring)env->GetObjectArrayElement(str_arry, len - 1);
const char* c_str = env->GetStringUTFChars(str1, 0);
jstring ret = env->NewStringUTF(c_str);
env->ReleaseStringUTFChars(str1, c_str);
return ret;

Java Int数组常用操作:

//截取某两个元素
int buf[2];
env->GetIntArrayRegion(int_array, 0, 2, buf);
LOGI("两个元素: %d , %d", buf[0], buf[1]);

//获取c数组指针
jboolean isCopy;
int* intArr = env->GetIntArrayElements(int_array, &isCopy);
LOGI("是否为拷贝:%s", isCopy ? "是" : "否");

//更改数据
int len = env->GetArrayLength(int_array);
intArr[len-1] = 99;
env->ReleaseIntArrayElements(int_array, intArr, JNI_ABORT);//关注第三个参数

//返回自定义的数组
jintArray jintArray1 = env->NewIntArray(2);
env->SetIntArrayRegion(jintArray1, 0, 2, buf);
return jintArray1;
上一篇下一篇

猜你喜欢

热点阅读