【发布时间】:2014-05-13 10:43:12
【问题描述】:
我正在尝试从 C++ 代码中设置 Java 对象的原始双精度数组字段。 Java对象定义为:
public class EmitterTrack {
public int trackNumber;
public long lastUpdatedTime;
public int associatedEmitterModeTrackNumber;
public EmitterObservationStruct updatedEmitterObservation;
public double[] emitterTypeProbabilities;
public EmitterTrack() {
emitterTypeProbabilities = new double[9];
updatedEmitterObservation = new EmitterObservationStruct();
}
}
创建新 EmitterTrack 对象并尝试设置双精度数组的 C++ 代码如下所示:
void sendEmitterTracksToJava(jclass javaEmitterTrackClass, JNIEnv *jniEnv, EmitterTrack emitterTrack) {
jmethodID ctor = jniEnv->GetMethodID(javaEmitterTrackClass, "<init>", "()V");
jobject javaEmitterTrack = jniEnv->NewObject(javaEmitterTrackClass, ctor, NULL);
jfieldID fid = jniEnv->GetFieldID(javaEmitterTrackClass, "emitterTypeProbabilities", "[D");
jintArray jary;
jary = (jintArray)jniEnv->GetObjectField(javaEmitterTrack, fid);
jint *intArray = jniEnv->GetIntArrayElements(jary, 0);
for (j = 0; j < 9; j++) {
intArray[j] = emitterTrack.emitterTypeProbabilities[j];
}
jniEnv->ReleaseIntArrayElements(jary, intArray, 0);
}
当我将 Java 发射器轨道对象传递回 Java 时,我看到的输出如下:
Emitter Track:
emitterTypeProbabilities[0]: 2.12199579097E-313
emitterTypeProbabilities[1]: 6.3659873739E-313
emitterTypeProbabilities[2]: 1.06099789568E-312
emitterTypeProbabilities[3]: 1.48539705397E-312
emitterTypeProbabilities[4]: 3.95E-322
emitterTypeProbabilities[5]: 0.0
emitterTypeProbabilities[6]: 0.0
emitterTypeProbabilities[7]: 0.0
emitterTypeProbabilities[8]: 0.0
有什么我做错了但我没有看到的地方吗?
【问题讨论】:
-
您期望什么值?对我来说,这些肯定看起来像浮点舍入错误......
-
你不应该用 jdoubleArray 代替 jintArray 吗?
-
哦,大声哭泣!!非常感谢……我一直盯着这个看,从来没有想过。我现在觉得自己像个白痴,但它已经解决了。
标签: java c++ memory-management java-native-interface