Android NDK передает 3D-массив с плавающей точкой на C-код - PullRequest
1 голос
/ 04 февраля 2012

Я хочу передать массив с плавающей точкой 3d (float [] [] []) из Java, чтобы отредактировать его и вернуть массив обратно в Java
Конечно, я могу сделать это только с 1D массивами с этим

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-массивом?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

Вы можете сгладить массив с плавающей запятой в Java в массив 1d.Затем вы можете получить доступ к каждому элементу исходного массива 3d, сгенерировав правильный индекс в массиве 1d.Также необходимо передать длину каждого измерения массива в собственный метод, чтобы собственный метод мог также генерировать правильные индексы в массив 1d

Java:

// 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 ++:

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

}
1 голос
/ 04 февраля 2012

Это все в документации JNI.Вот объяснение того, как использовать многомерные массивы в JNI вместе с примером для двумерного массива: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jnistring.html#multi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...