Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java到C的JNI转换++; 我的C++函数参数是“代码> STD::vector和< /COD>”,那么从java传递参数的最佳方法是什么?作为向量使数组动态,但我传递的值是静态的。抱歉,如果我问错了问题,因为我是Java新手_Java_C++_Java Native Interface - Fatal编程技术网

从Java到C的JNI转换++; 我的C++函数参数是“代码> STD::vector和< /COD>”,那么从java传递参数的最佳方法是什么?作为向量使数组动态,但我传递的值是静态的。抱歉,如果我问错了问题,因为我是Java新手

从Java到C的JNI转换++; 我的C++函数参数是“代码> STD::vector和< /COD>”,那么从java传递参数的最佳方法是什么?作为向量使数组动态,但我传递的值是静态的。抱歉,如果我问错了问题,因为我是Java新手,java,c++,java-native-interface,Java,C++,Java Native Interface,实际上,我正在从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*}' t

实际上,我正在从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>&'
错误:无法将'img'从'jfloat*{aka float*}'转换为'std::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);
}
JNIEXPORT void JNICALL Java_Main_foo(JNIEnv*env,jclass clazz,jfloatArray输入)
{
float*array=env->GetFloatArrayElements(输入,NULL);
jsize len=env->GetArrayLength(输入);
std::向量img(数组,数组+len);
//假设foo不会改变img
env->ReleaseFloatArrayElements(输入、数组、JNI_中止);
foo(img);
}

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

Afaik
jfloat*
可以转换为
float*
,您可以使用这个:然后将该向量传递给您的函数。这很有效,我在函数声明中也做了更正。谢谢