【发布时间】:2010-03-01 05:30:08
【问题描述】:
我有一个 C 语言中的无符号整数数组和一个长整数 java 数组。我想将无符号整数的内容复制到 java 数组。到目前为止,我发现的唯一函数是 SetLongArrayRegion(),但这需要整个缓冲区数组。有没有只设置java数组的单个元素的函数?
【问题讨论】:
标签: c arrays java-native-interface set
我有一个 C 语言中的无符号整数数组和一个长整数 java 数组。我想将无符号整数的内容复制到 java 数组。到目前为止,我发现的唯一函数是 SetLongArrayRegion(),但这需要整个缓冲区数组。有没有只设置java数组的单个元素的函数?
【问题讨论】:
标签: c arrays java-native-interface set
还有一个用于原始“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中的长数组被称为longArray,并且java类被保存在一个JNI jclass变量javaClass中。
【讨论】:
有一个 SetObjectArrayElement() 函数,适用于非本地类型。如果您真的非常想使用这种方法,我认为您可以创建一个 Long 数组。不过,您可能仍然会遇到类型转换的问题。
我认为你的大问题是你试图将无符号整数转换为 Java 长整数。 Java long 是 有符号 64 位数字。正确转换后,您可以在 c 中创建一个 jlong 类型的数组,然后使用 SetLongArrayRegion() 方法将数字返回给 java。
【讨论】: