我的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>&'
答案 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将能够通过加载的共享库(动态链接库)中的命名空间,类和方法名称找到它。