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

标签 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 的新手,所以请多多包涵...

谢谢。

最佳答案

我不是 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);

顺便说一句,我建议使用 vector 而不是数组。

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

关于java - 如何使用 JNI 在 C++ 中设置类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30604083/

相关文章:

java - 使用 Windows 下生成的 (.PFX) 证书对 Java 中的文本进行签名

c++ - iOS 上的可恢复断言/断点,例如带有 MS 编译器的 __debugbreak()

c++ - 破译 g++ vtable 转储所需的帮助

android - 如何在 Android 运行时导入共享对象库?

c# - 从 Java 迁移到 C#

java - 为什么我的程序本应运行时间较短,但运行时间却较长?

java - 我如何压缩或编码椭圆曲线公钥并将其放在网络上?

c++ - 为什么编译器不提示错误的枚举值

c - C 中的异常处理 - 从 Java JNI 捕获 native C 崩溃

cocoa - 从 Cocoa 应用程序使用 Lucene 的最佳方式是什么?