【问题标题】:How to return double[] in jni input argument如何在 jni 输入参数中返回 double[]
【发布时间】:2015-08-12 17:27:36
【问题描述】:

在我的 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 个双精度值?

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

【问题讨论】:

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


    【解决方案1】:

    它应该如下所示:

    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

    【讨论】:

    • 完美!谢谢,我没有意识到调用 Release 时这些值会被写回数组。
    【解决方案2】:

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

    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 表示失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-24
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 2019-03-19
      • 1970-01-01
      相关资源
      最近更新 更多