2012-02-04 3 views
1

3 차원 float 배열 (float [] [] [])을 java에서 c로 수정하고 배열을 Java로 다시 전달하려고합니다
Curretly 저는 이것을 할 수 있습니다 이 1D 배열의 경우안드로이드 NDK는 C 코드에 3D float 배열을 전달합니다

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 passing objects"를 검색하면 많은 자원을 얻을 것이다. – vitakot

답변

3

Java의 3d float 배열을 1 차원 배열로 전개 할 수 있습니다. 그런 다음 1 차원 배열에 올바른 색인을 생성하여 원래의 3 차원 배열의 각 요소에 액세스 할 수 있습니다.

// 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); 

} 
관련 문제