java复制数组函数,复制C中的数组到Java数组使用JNI

I have an array of unsigned integers in C and a java array of longs. I want to copy the contents of the unsigned integers to the java array. So far, the only function that I've found to do this is SetLongArrayRegion(), but this takes an entire buffer array. Is there a function to set only the individual elements of the java array?

解决方案

There is also a function for the primitive 'long' type to set individual elements in JNI. So I believe what you want to have is something like this

unsigned int* cIntegers = getFromSomewhere();

int elements = sizeof(cIntegers) / sizeof(int);

jfieldID jLongArrayId = env->GetFieldID(javaClass, "longArray", "[J");

jlongArray jLongArray = (jlongArray) env->GetObjectField(javaObject, jLongArrayId);

for (unsigned int i = 0; i < elements; ++i) {

unsigned int cInteger = cIntegers[i];

long cLong = doSomehowConvert(cInteger);

env->SetLongArrayElement(jLongArray, i, (jlong) cLong);

}

if the long array in java is called longArray and the java class is saved in a JNI jclass variable javaClass.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java数组是非常常见的数据结构,而在C/C++,操作数组也是非常方便的。在JNI,我们可以通过JNI提供的函数来操作Java数组。本篇文章将详细介绍如何在C/C++操作Java数组。 1. 获取数组信息 在C/C++,我们需要获取Java数组的长度、元素类型、以及数组元素的指针等信息才能对数组进行操作。JNI提供了一系列的函数来获取这些信息。 - 获取数组长度:使用GetArrayLength()函数可以获取Java数组的长度,其函数原型如下: ```c++ jsize GetArrayLength(JNIEnv *env, jarray array); ``` 其,env表示JNI的环境变量,array表示要获取长度的Java数组。该函数返回Java数组的长度。 - 获取数组元素类型:使用GetArrayElements()函数可以获取Java数组的元素类型,其函数原型如下: ```c++ jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize); jbyteArray (*NewByteArray)(JNIEnv*, jsize); jcharArray (*NewCharArray)(JNIEnv*, jsize); jshortArray (*NewShortArray)(JNIEnv*, jsize); jintArray (*NewIntArray)(JNIEnv*, jsize); jlongArray (*NewLongArray)(JNIEnv*, jsize); jfloatArray (*NewFloatArray)(JNIEnv*, jsize); jdoubleArray (*NewDoubleArray)(JNIEnv*, jsize); ``` 其,env表示JNI的环境变量,size表示数组的长度。该函数返回一个新的Java数组对象。 - 获取数组元素指针:使用GetArrayElements()函数可以获取Java数组的元素指针,其函数原型如下: ```c++ jboolean* (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*); jbyte* (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*); jchar* (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*); jshort* (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*); jint* (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*); jlong* (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*); jfloat* (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*); jdouble* (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*); ``` 其,env表示JNI的环境变量,array表示要获取指针的Java数组,isCopy表示是否需要复制数据。该函数返回Java数组元素指针。 - 释放数组元素指针:使用ReleaseArrayElements()函数可以释放Java数组元素指针,其函数原型如下: ```c++ void (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*, jint); void (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray, jbyte*, jint); void (*ReleaseCharArrayElements)(JNIEnv*, jcharArray, jchar*, jint); void (*ReleaseShortArrayElements)(JNIEnv*, jshortArray, jshort*, jint); void (*ReleaseIntArrayElements)(JNIEnv*, jintArray, jint*, jint); void (*ReleaseLongArrayElements)(JNIEnv*, jlongArray, jlong*, jint); void (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray, jfloat*, jint); void (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray, jdouble*, jint); ``` 其,env表示JNI的环境变量,array表示要释放指针的Java数组,elems表示要释放的Java数组元素指针,mode表示释放模式(0表示更新Java数组JNI_COMMIT表示更新Java数组并释放elems,JNI_ABORT表示不更新Java数组并释放elems)。 2. 操作数组元素 在获取到Java数组的元素指针之后,我们就可以对Java数组进行操作了。在C/C++Java数组元素的访问方式与C/C++数组相同,我们可以使用数组下标的方式访问Java数组元素。 3. 代码示例 下面是一个简单的代码示例,展示了如何在C/C++操作Java的int数组Java代码: ```java public class JNIIntArrayExample { static { System.loadLibrary("jniexample"); } public native int[] sort(int[] arr); } ``` C/C++代码: ```c++ #include <jni.h> #include <stdio.h> JNIEXPORT jintArray JNICALL Java_JNIIntArrayExample_sort(JNIEnv *env, jobject obj, jintArray arr) { // 获取数组长度 jsize len = env->GetArrayLength(arr); // 获取数组元素指针 jint *elems = env->GetIntArrayElements(arr, NULL); // 对数组元素进行操作 for (int i = 0; i < len; i++) { for (int j = i + 1; j < len; j++) { if (elems[i] > elems[j]) { jint tmp = elems[i]; elems[i] = elems[j]; elems[j] = tmp; } } } // 创建新的Java数组对象 jintArray result = env->NewIntArray(len); // 将排序后的数组拷贝到新的Java数组对象 env->SetIntArrayRegion(result, 0, len, elems); // 释放数组元素指针 env->ReleaseIntArrayElements(arr, elems, 0); // 返回新的Java数组对象 return result; } ``` 其,sort()函数接收一个Java的int数组,对其进行排序,并返回一个新的排序后的Java的int数组。在sort()函数,我们首先通过GetArrayLength()函数获取Java数组的长度,然后通过GetIntArrayElements()函数获取Java数组的元素指针。接着,我们对Java数组元素进行操作,这里使用了冒泡排序算法。最后,我们创建一个新的Java数组对象,并通过SetIntArrayRegion()函数将排序后的数组拷贝到新的Java数组对象。最后,我们通过ReleaseIntArrayElements()函数释放Java数组元素指针,并返回新的Java数组对象。 4. 总结 本篇文章介绍了如何在C/C++操作Java数组,包括获取数组信息、操作数组元素等。在JNI,操作Java数组与操作C/C++数组十分相似,只需要掌握好JNI提供的函数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值