在我的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,而是想用值填充双精度数组。
答案 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表示失败。