2014-05-13 49 views
0

我想從C++代碼中設置Java對象的原始雙數組字段。該Java對象定義爲:Java JNI:在C++中設置基本(雙)數組的錯誤值

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 

有什麼,我做錯了,我只是沒有看到?

+0

您期待什麼值?那些肯定看起來像浮點舍入錯誤... – awksp

+0

不應該使用jdoubleArray而不是jintArray? –

+0

哦,大聲哭喊!非常感謝你......我一直在盯着這個永遠,它從來沒有想過我。我現在覺得自己像一個白癡,但它是固定的。 – homebrew2k9

回答

0

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