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

时间:2010-03-01 05:30:09

标签: c arrays java-native-interface set

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

2 个答案:

答案 0 :(得分:5)

原始'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中。

答案 1 :(得分:2)

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

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