使用JNI将C数组复制到Java数组中

我在C中有一个无符号整数数组和一个long数组java数组。 我想将无符号整数的内容复制到java数组中。 到目前为止,我发现执行此操作的唯一函数是SetLongArrayRegion(),但这需要一个完整的缓冲区数组。 是否有一个函数只设置java数组的各个元素?

原始“long”类型还有一个函数可以在JNI中设置单个元素。 所以我相信你想拥有的是这样的

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); } 

如果java中的long数组被称为longArray并且java类保存在JNI jclass变量javaClass

有一个SetObjectArrayElement()函数,适用于非本机类型。 如果你真的想要使用这种方法,我认为你可以创建一个Longs数组。 您可能仍然遇到类型转换问题。

我认为你最大的问题是你试图将无符号整数转换为Java long。 Java longs是64位数字。 一旦你的转换正确,你可以在c中创建一个jlong​​类型的数组,然后使用SetLongArrayRegion()方法将数字返回到java。