JNI--数组的访问
2020-04-08 本文已影响0人
aruba
今天来使用JNI对数组操作,数组分为基本类型数组和引用类型数组,首先来看下基本类型数组的使用
1.基本类型数组
我们在java中定义一个方法,传入一个int型数组,使用c++进行排序
package com.aruba.jniapplication;
/**
* JNI访问数组
*/
public class JniDemo4 {
static {
System.load("C:\\Users\\tyqhc\\source\\repos\\JniApplication\\x64\\Debug\\JniApplication.dll");
}
public native void sortIntArray(int[] arry);
public static void main(String[] args) {
JniDemo4 jniDemo4 = new JniDemo4();
int[] arry = {3, 70, 43, 4, 62, 10};
jniDemo4.sortIntArray(arry);
for (int i = 0; i < arry.length; i++) {
System.out.println(arry[i]);
}
}
}
c++中使用sort方法,需要先引入头文件<algorithm>
//访问基本类型数据数组
JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo4_sortIntArray
(JNIEnv* env, jobject jobj, jintArray arry) {
//将java的int数组转化为c++的int数组
const int size = env->GetArrayLength(arry);
jint* c_arry = env->GetIntArrayElements(arry,NULL);
sort(c_arry,c_arry+size);
//通知JVM可以释放,并将修改的数据重新写回原来的内存
env->ReleaseIntArrayElements(arry, c_arry, JNI_COMMIT);
}
默认升序排列,可以自定义方法实现降序排列
//为true,则不交换
bool compare(int a, int b){
return a > b; //降序排列,如果改为return a<b,则为升序
}
//访问基本类型数据数组
JNIEXPORT void JNICALL Java_com_aruba_jniapplication_JniDemo4_sortIntArray
(JNIEnv* env, jobject jobj, jintArray arry) {
//将java的int数组转化为c++的int数组
const int size = env->GetArrayLength(arry);
jint* c_arry = env->GetIntArrayElements(arry,NULL);
sort(c_arry,c_arry+size,compare);
//通知JVM可以释放,并将修改的数据重新写回原来的内存
env->ReleaseIntArrayElements(arry, c_arry, JNI_COMMIT);
}
执行java代码:
2.引用类型数组
在java中定义一个native方法,用来获取一个String数组
public native String[] getArrayByC(int size);
编写相应的C++代码,获取一个size大小的字符串数组,并进行赋值后返回出去
JNIEXPORT jobjectArray JNICALL Java_com_aruba_jniapplication_JniDemo4_getArrayByC
(JNIEnv*, jobject);
//访问引用类型数据数组
JNIEXPORT jobjectArray JNICALL Java_com_aruba_jniapplication_JniDemo4_getArrayByC
(JNIEnv* env, jobject jobj, jint size) {
//创建需要返回的jobjectArray
jobjectArray result;
jclass string_clz = env->FindClass("java/lang/String");
if (string_clz == 0) {
return 0;
}
//三个参数:1:数组大小 2:数组的jclass 3:调用该方法的jobject
result = env->NewObjectArray(size, string_clz, jobj);
if (result == 0) {
return 0;
}
//往数组里塞数据
for (int i = 0; i < size; i++) {
char *str = (char *)malloc(55);
memset(str,0, 55);
sprintf(str, "hello by c++ %d", i);
jstring string_val = env->NewStringUTF(str);
env->SetObjectArrayElement(result,i,string_val);
free(str);
}
return result;
}