如何使用JNI在C ++中设置类成员

时间:2015-06-02 18:43:33

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

我使用JNI从java获取变量并将其设置为我的C ++类的类成员。

这是我的代码:

JNIEXPORT void JNICALL Java_class_classname_Event(JNIEnv* env, jobject obj, jFloatarray arr)
{
    jfloat *_arr = env->GetFloatArrayElements(arr, 0);
    env->ReleaseFloatArrayElements(arr, _arr, 0);

}

如何将C ++类成员的值设置为arr? 我对C ++和JNI很陌生,所以请耐心等待......

谢谢。

1 个答案:

答案 0 :(得分:1)

我不能100%确定副本的方向,所以这里有两个答案:

1)将java数组复制到C ++类成员:

JNI管理GetFloatArrayElements()返回的数组,因此在发布后不能保留它。如果你想用C ++继续,你可以克隆它:

jsize l = env->GetArrayLength(arr); 
jfloat *_arr = env->GetFloatArrayElements(arr, 0);
mycpp_arr = new jfloat[l]; 
copy(_arr, _arr+l, mycpp_arr);  
env->ReleaseFloatArrayElements(arr, _arr, 0);

顺便说一句,我建议去寻找一个向量而不是一个数组。

2)或者将用C ++进行的更改复制回Java:

一切都取决于。如果你想在JNI回调中做int:

jboolean isCopy; 
jfloat *_arr = env->GetFloatArrayElements(arr, &isCopy);

// if isCopy==JNI_FALSE you work directelyon the original Java data
// if it's JNI_TRUE, you work on a temporary copy

... // do your stuff, supposing that you want all changes to _arr[] reflected
    // in the original Java array

env->ReleaseFloatArrayElements(arr, _arr, JNI_COMMIT); // copy back 
// nota: if isCopy was JNI_TRUE you could opt for JNI_ABORT to cancel changes
// but this is ignored if you did your chang eon the original daa