JNI SetDoubleArrayRegion问题

时间:2010-08-17 23:33:08

标签: java c arrays java-native-interface

我试过看一堆论坛,尽管经过大量的调整和重新分析,但我有点卡住了。

我正在尝试通过JNI从我的C ++代码返回一个jdoubleArray,但我似乎进入的值似乎没有进行。这是代码。

    jdoubleArray ret = env->NewDoubleArray(2);

jdouble* rotationsJ = (jdouble *) malloc(2*sizeof(jdouble));
rotationsJ[0] = 4; //whatever, some dummy values.
rotationsJ[1] = 4;

cout<<"Rotations 0..."<<rotationsJ[0]; //Java console tells me this is 4, as it should.
env->SetDoubleArrayRegion(ret, 0, 2, (const jdouble*)rotationsJ);

return  ret; 
//EDIT - my java code looks like the following 
    double[] rotations = new double[2];

    rotations = pnMain.rotateLeftRight(true); //PNMain is the calling class, rotateLeftRight returns a jDoubleArray. 
//Was wondering if my Java declaration of rotations is needed?

现在在Java代码中,C代码返回的数组被清零。我似乎无法改变它的价值观。我认为使用SetDoubleArrayRegion函数会(希望)使数组'ret'具有rotationsJ的内容,但这不起作用。我只是得到一个由两个元素组成的数组,其值为0.0,并在Java中传递给我。

感谢任何帮助/问题。

编辑 - 我可以为此添加更多信息。我试过了:

    jboolean isCopy; 
jdouble* test = env->GetDoubleArrayElements(ret, &isCopy); 
cout<<"Test ..."<<test[1]; //This actually printed out the second element's value in Java.

所以我决定尝试额外的打印语句 - 我复制了我想要返回到C中的另一个缓冲区,然后尝试将其打印出来。这实际上反映了价值,而仅使用'ret'进行设置。返回语句/ Java代码设置中是否会出现问题?

1 个答案:

答案 0 :(得分:0)

您对JNI的使用看起来是正确的。您不需要Java代码中的“new double [2]”,因为您立即用rotateLeftRight的返回值替换该值。

如果将“jdouble”赋值作为整数类型而不是双精度浮点数处理,则可能会发生这种情况。例如,如果将整数4的64位模式存储为double,则在打印时会看到0.0。尝试存储“4.0”而不是4,或将其设置为4668012349850910720LL。