【问题标题】:Java JNI: Bad values in primitive (double) array set within C++Java JNI:C++ 中原始(双)数组集中的错误值
【发布时间】: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


【解决方案1】:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2011-07-18
    • 1970-01-01
    • 2012-08-22
    • 2016-02-14
    • 2011-08-29
    • 2018-12-14
    相关资源
    最近更新 更多