2017-04-15 49 views
0

C++関数の引数の型はstd::vector<float>&なので、JAVAからパラメータを渡す最も良い方法は何ですか?ベクトルは配列を動的にしますが、渡す値は静的です。私が間違った質問をした場合、私はJavaに慣れていません。JavaからC++へのJNI変換

実際には、私は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>&' 
+0

私の知る限り、'、あなたはこの使用できますhttp://stackoverflow.com/questions/24918686/convert-from-float-to-vectorfloatをして、あなたの関数にそのベクトルを渡します。 –

答えて

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はロードされた共有ライブラリ(ダイナミックリンクライブラリ)内の名前空間、クラス、メソッド名によってJVMを見つけることができます。 * ``フロート* `への転換であるjfloat

+0

これがうまくいって、私は関数の宣言にも訂正を加えました。ありがとう! –

関連する問題