Java JNI: c++中原始(双精度)数组集合中的错误值

Java JNI: Bad values in primitive (double) array set within C++

本文关键字:集合 数组 错误 JNI c++ 原始 Java 双精度      更新时间:2023-10-16

我试图从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

有没有什么我做错了,只是我没有看到?

Sir RoTN成功了!我愚蠢地使用jintArray和获取/释放int数组,而不是double。用以下代码替换可以修复一切:

jdoubleArray jary;
jary = (jdoubleArray)jniEnv->GetObjectField(javaEmitterTrack, fid);
jdouble *doubleArray = jniEnv->GetDoubleArrayElements(jary, 0);
for (j = 0; j < 9; j++) {
  doubleArray[j] = emitterTrack.emitterTypeProbabilities[j];
}
jniEnv->ReleaseDoubleArrayElements(jary, doubleArray, 0);