我有一个C语言中的无符号整数数组和一个Java长整型数组。我想将无符号整数的内容复制到Java数组中。目前,我发现唯一可以做到这一点的函数是SetLongArrayRegion(),但它需要整个缓冲区数组。是否有一种方法只设置Java数组的单个元素?
我有一个C语言中的无符号整数数组和一个Java长整型数组。我想将无符号整数的内容复制到Java数组中。目前,我发现唯一可以做到这一点的函数是SetLongArrayRegion(),但它需要整个缓冲区数组。是否有一种方法只设置Java数组的单个元素?
在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
中。
有一个SetObjectArrayElement()函数,可以处理非本地类型。如果你真的想使用这种方法,我认为你可以创建一个Long数组。但是你可能仍然会遇到类型转换的问题。
我认为你在这里遇到的大问题是尝试将无符号整数强制转换为Java longs。Java longs是带符号的64位数字。一旦你的转换正确,你可以在C中创建一个jlong类型的数组,然后使用SetLongArrayRegion()方法将数字传回Java。