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