从Java到C的JNI转换++; 我的C++函数参数是“代码> STD::vector和< /COD>”,那么从java传递参数的最佳方法是什么?作为向量使数组动态,但我传递的值是静态的。抱歉,如果我问错了问题,因为我是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
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*
,您可以使用这个:然后将该向量传递给您的函数。这很有效,我在函数声明中也做了更正。谢谢