2012-02-04 10 views
1

3D浮動配列(float [] [] [])をjavaからcに渡して編集し、配列をJavaに戻したい
Curretly私はこれを行うことができますこのような1D配列の場合Android NDKがCコードに3D浮動小数点配列を渡す

jfloat* valuesjf = NULL; 
float* valuesf = NULL; 
void Java_Grids_Grid5_Update(JNIEnv* env,jobject thiz,jfloatArray values) 
{ 
    valuesjf = (*env)->GetFloatArrayElements(env,values,NULL); 
    valuesf = valuesjf; 

    valuesf[0]=121+valuesf[0];//do some calculations 

    (*env)->ReleaseFloatArrayElements(env, values, valuesjf, JNI_ABORT); 
} 

3D配列ではどうすればいいですか?

+0

私はあなたがラッパークラスを介してそれを行う必要があると思う "JNI渡すオブジェクト"を検索しようとすると、多くのリソースを取得します。 – vitakot

答えて

3

Javaの3d float配列を1次元配列にフラット化することができます。次に、2次元配列の例を示します。その後、1d配列に正しいインデックスを生成することによって、元の3d配列の各要素にアクセスできます。

// The lengths of each dimension of the values array 
int l, m, n; 
// Instead of: 
// float[][][] values = new float[l][m][n]; 
// Do this: 
float[] values = new float[l * m * n]; 

// To access an entry at (x, y, z) in the array. 
// Instead of: 
// float v = values[z][y][x]; 
// Do this: 
int i = (m * n * z) + (n * y) + x; 
float v = values[i]; 

C++:

また、ネイティブメソッドはまた、1Dアレイ

ジャワに正しいインデックスを生成することができるように、ネイティブメソッドにアレイの各次元の長さを渡す必要があります

// You should not store a reference to the Java array as a global variable. 
// The reference is only valid between the Get/ReleaseFloatArrayElements calls 
// Since valuesf is assigned the same reference to the Java array, 
// the same advice also applies to it 
// jfloat* valuesjf = NULL; 
// float* valuesf = NULL; 

void 
Java_Grids_Grid5_Update(JNIEnv* env, 
         jobject thiz, 
         jfloatArray values, 
         jint l, jint, m, jint n) { 

    jfloat* valuesjf = (*env)->GetFloatArrayElements(env,values,NULL); 
    float* valuesf = valuesjf; 

    int x, y, z; 
    int i = (m * n * z) + (n * y) + x; 
    valuesf[0]=121+valuesf[i]; //do some calculations 

    (*env)->ReleaseFloatArrayElements(env, values, valuesjf, JNI_ABORT); 

} 
関連する問題