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

4

我有一个C语言中的无符号整数数组和一个Java长整型数组。我想将无符号整数的内容复制到Java数组中。目前,我发现唯一可以做到这一点的函数是SetLongArrayRegion(),但它需要整个缓冲区数组。是否有一种方法只设置Java数组的单个元素?

2个回答

5

在JNI中,还有一种针对原始数据类型“long”的函数,可以用来设置单个元素。所以我认为你想要的是这样的:

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中的长整型数组称为longArray,并且Java类保存在JNI jclass变量javaClass中。


抱歉回复晚了,我没有意识到我没有勾选复选框。感谢您的帮助。 - LandonSchropp

3

有一个SetObjectArrayElement()函数,可以处理非本地类型。如果你真的想使用这种方法,我认为你可以创建一个Long数组。但是你可能仍然会遇到类型转换的问题。

我认为你在这里遇到的大问题是尝试将无符号整数强制转换为Java longs。Java longs是带符号的64位数字。一旦你的转换正确,你可以在C中创建一个jlong类型的数组,然后使用SetLongArrayRegion()方法将数字传回Java。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接