如何使用 JNI 在 C++ 中设置 class 成员
How to set class member in C++ using JNI
我正在使用 JNI 从 java 获取变量并将其设置为我的 C++ class 的 class 成员 class。
这是我的代码:
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++ class 成员的值设置为 arr?
我是 C++ 和 JNI 的新手,所以请多多包涵...
谢谢。
我不是100%确定文案的方向,所以这里有两个答案:
1) 将java数组复制到C++ class成员:
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
我正在使用 JNI 从 java 获取变量并将其设置为我的 C++ class 的 class 成员 class。
这是我的代码:
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++ class 成员的值设置为 arr? 我是 C++ 和 JNI 的新手,所以请多多包涵...
谢谢。
我不是100%确定文案的方向,所以这里有两个答案:
1) 将java数组复制到C++ class成员:
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