java - 从 Java 到 C++ 的 JNI 转换

标签 java c++ java-native-interface

我的 C++ 函数参数的类型是 std::vector<float>&那么从 JAVA 传递参数的最佳方式是什么?作为 vector 使数组动态但我传递的值是静态的。如果我是 Java 新手,如果我问错了问题,我深表歉意。

实际上,我正在传递具有 float 数组的图像数据Java 端的值。

我试过以下:

JNIEXPORT void JNICALL foo(JNIEnv* env, Jclass clazz, JfloatArray input){
jfloat* img = env->GetFloatArrayElements(input,NULL)

...
}

但它给出了以下错误:

error: could not convert 'img' from 'jfloat* {aka float*}' to 'std::vector<float>&'

最佳答案

您只需将数据复制到一个新的 vector 中——这就是 vector 的工作方式;它提供了改变长度的能力。

JNIEXPORT void JNICALL Java_Main_foo(JNIEnv *env, jclass clazz, jfloatArray input)
{
    float* array = env->GetFloatArrayElements(input, NULL);
    jsize len = env->GetArrayLength(input);
    std::vector<float> img (array, array+len );
    // assuming foo will not alter img
    env->ReleaseFloatArrayElements(input, array, JNI_ABORT);
    foo(img);
}

注意:您的 native 函数签名看起来有点可疑。它们通常是在已编译的 Java 类上使用 javah 实用程序生成的。这样 JVM 将能够通过加载的共享库(动态链接库)中的 namespace 、类和方法名称找到它。

关于java - 从 Java 到 C++ 的 JNI 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43429223/

相关文章:

java - "String Compact"给当前的JNI引入了一些性能问题,如何避免

java - 使用接口(interface)在 JNI 中实现回调函数

java - 使用 JNI 时如何在 C++ 中获取 Java 异常的描述?

java - 尝试使用 iText7 合并合并 pdf,但是当我打开最终合并的 pdf 时,它说无法加载 pdf 文档

c++ - gdb 列表错误 "No such file or directory"

java - 如何使用 Apache-POI 获取 Excel 工作表的默认列宽?

c++ - 如何在没有 std::initializer_list 的情况下列出初始化模板类,使其具有固定大小

c++ - 使用 cin 获取多个带空格的输入

javascript - 如何在 Intellij IDEA 中按位置模式自动注入(inject)语言?

java - 使用 BufferedReader 进行递归