JNI从Java到C ++的转换

时间:2017-04-15 17:38:44

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

我的c ++函数参数类型为std::vector<float>&,那么从JAVA传递参数的最佳方法是什么?由于向量使数组动态,但我传递的值是静态的。如果我问错了问题,我很抱歉,因为我不熟悉Java。

实际上我传递的是来自Java端的具有float值数组的图像数据。

我试过以下:

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>&'

1 个答案:

答案 0 :(得分:1)

你只需要将数据复制到一个新的向量 - 这就是向量的工作方式;它提供了改变长度的能力。

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);
}

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