如何在jni输入参数中返回double []

时间:2015-05-29 18:18:45

标签: java c++ arrays java-native-interface arguments

在我的Java代码中,我定义了以下函数签名:

public native boolean getData( double [] data );

在我的C ++代码中,我想填充双数组数据以返回到Java,并且函数返回的布尔值将指示数据是否设置正确。

javah创建了以下C ++函数签名:

JNIEXPORT jboolean JNICALL Java_com_test_getData___3D( JNIEnv* pEnv, jclass cls, jdoubleArray dArray ) 

如何在C ++中实现此功能,以便返回C ++代码中生成的3个double值?

我想做一些类似于本文的内容:http://www.javaworld.com/article/2077554/learn-java/java-tip-54--returning-data-in-reference-arguments-via-jni.html我不想使用StringBuffer,而是想用值填充双精度数组。

2 个答案:

答案 0 :(得分:4)

它应如下所示:

JNIEXPORT jboolean JNICALL Java_com_test_getData___3D( JNIEnv* pEnv, jclass cls, jdoubleArray dArray )
{
    jboolean isCopy1;
    jdouble* srcArrayElems = 
           pEnv->GetDoubleArrayElements(dArray, &isCopy1);
    jint n = pEnv->GetArrayLength(dArray);
    jboolean res = false;

    // here update srcArrayElems values, maybe set res to true

    if (isCopy1 == JNI_TRUE) {
       pEnv->ReleaseDoubleArrayElements(dArray, srcArrayElems, JNI_ABORT);
    }
    return res ;
}

调用getdata时,必须已经分配了数组 - 这意味着长度正确。

我还没有编译这段代码,你可以在google上找到很多样本,这里有一些很好的链接:

http://www.ict.nsc.ru/win/docs/java/tutorial/native1.1/implementing/array.html http://statweb.stanford.edu/~naras/java/course/lec5/lec5.html

答案 1 :(得分:0)

不要返回布尔值,而是考虑返回一个双元组:{x,y,z,isValid},其中isValid == 0表示“false”。

jdoubleArray Java_com_test_getData__3D(JNIEnv *env, jclass cls)
{
  double xyzValid[4];
  populateMyData(xyzValid);

  jdoubleArray jXyzValid = env->NewDoubleArray(4);
  env->SetDoubleArrayRegion(jXyzValid , 0, 4, xyzValid);

  return jXyzValid;
}

另一种选择可能是返回{x,y,z}表示成功,返回NULL表示失败。