2011-12-16 18 views
3

私はC++とjniを使って自分自身にアンドロイドのndkを教えるための自分の小さなプロジェクトを乱してきましたが、どのようにjava floatからデータを渡すかわかりません配列をC++配列にコピーします。私はjniセットアップを使用しました。私が見つけたチュートリアルは、あまりにも単純すぎるし、十分に説明していないか、あまりにも複雑で、現時点で私の理解を超えています。ですから、javaからC++に渡された配列の簡単な例を指摘し、データに対して実行されたいくつかのメソッド/関数をjavaに送り返すことができます。C++とJNI - jfloatArrayに配列を渡す方法

Heres私の試みはこれまでのところですが、途中で2つのエラーが残っています。私は構文の残りの部分はどちらでもparのどちらかがわかりませんが、コンパイル時に何も表示されません。

#include <iostream> 
#include <Eigen/Dense> 
#include <math.h> 
#include <jni.h> 

using namespace Eigen; 

Vector3f vec; 
Vector3f vec2; 
Vector3f vecRtrn; 


void vecLoad(float x, float y, float z, float x2, float y2, float z2){ 

vec(0) = x; 
vec(1) = y; 
vec(2) = z; 
vec2(0) = x2; 
vec2(1) = y2; 
vec2(2) = z2; 

} 

void vecAdd(Vector3f vecA, Vector3f vecB){ 
vecRtrn = vecA+vecB; 
} 

extern "C" 
{ 
JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test 
(JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2){ 

float array1[3]; 

jfloatArray flt1 = fltarray1; 
jfloatArray flt2 = fltarray2; 

//flt1 = env->GetFloatArrayElements(fltarray1,0); 
//flt2 = env->GetFloatArrayElements(fltarray2,0); 


vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]); 
vecAdd(vec, vec2); 

array1[0] = vecRtrn[0]; 
array1[1] = vecRtrn[1]; 
array1[2] = vecRtrn[2]; 

return array1; 

}; 
} 

そして、これらは、あなたが直接jfloatArrayを使用することはできませんコンパイル時に

$ /cygdrive/c/android-ndk-r7/ndk-build 
Compile++ thumb : test <= test.cpp 
jni/test.cpp: In function '_jfloatArray* Java_jnimath_act_JnimathActivity_test(JNIEnv*, _jobject*, _jfloatArray*, _jfloatArray*)': 
jni/test.cpp:42: error: cannot convert '_jfloatArray' to 'float' for argument '1' to  'void vecLoad(float, float, float, float, float, float)' 
jni/test.cpp:49: error: cannot convert 'float*' to '_jfloatArray*' in return 
make: *** [obj/local/armeabi/objs/test/test.o] Error 1 

答えて

17

まずエラーです。代わりに、これを行う必要があります

JNIEXPORT jfloatArray JNICALL Java_jnimath_act_JnimathActivity_test 
(JNIEnv *env, jobject obj, jfloatArray fltarray1, jfloatArray fltarray2) 
{ 

jfloatArray result; 
result = env->NewFloatArray(3); 
if (result == NULL) { 
    return NULL; /* out of memory error thrown */ 
} 

jfloat array1[3]; 
jfloat* flt1 = env->GetFloatArrayElements(fltarray1,0); 
jfloat* flt2 = env->GetFloatArrayElements(fltarray2,0); 


vecLoad(flt1[0], flt1[1], flt1[2], flt2[0], flt2[1], flt2[2]); 
vecAdd(vec, vec2); 

array1[0] = vecRtrn[0]; 
array1[1] = vecRtrn[1]; 
array1[2] = vecRtrn[2]; 

env->ReleaseFloatArrayElements(fltarray1, flt1, 0); 
env->ReleaseFloatArrayElements(fltarray2, flt2, 0); 
env->SetFloatArrayRegion(result, 0, 3, array1); 
return result; 

} 

これをチュートリアルとして活用してください。私が前に言ったように、勉強はこの時に練習するよりもあなたを助けるでしょう。

+0

ねえ、これは簡単なJNIテストアプリを取得した場合のおかげでポールが.....私は病気がすべてのソースでそれをここに掲示してください作業しています:) –

+0

私は感謝思い付いたHERESにちょっとソリューションあなたの助けに:) http://stackoverflow.com/questions/8543221/android-a-simple-ndk-project-using-the-eigen-library-and-jni –

0

代わりに、古いスタイルは、(泰・宋新のコードの上に、まだ動作します)、私たちは、最近、これを行う必要があります。これは、基本的に新しいndksで空の配列を作成するために十分である

jfloatArray result; 
result = (*env)->NewFloatArray(env, numbers_here); 
+2

"numbers_here"の_exact_構文はなんですか?ブレース? parantheses?コンマ区切りの引数? – aasu

0

。 envがjni環境であると仮定します。

jfloatArray jArray = env -> NewFloatArray(8); 
関連する問題