Android NDK将3D浮点数组传递给C代码

时间:2012-02-04 17:06:34

标签: java android c++ c android-ndk

我想从java传递一个3d float数组(float [] [] [])来编辑它并将数组返回给java Curretly我只能用这个

的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 个答案:

答案 0 :(得分:3)

您可以将Java中的3d float数组展平为1d数组。然后,您可以通过在1d数组中生成正确的索引来访问原始3d数组的每个元素。您还需要将数组的每个维度的长度传递给本机方法,以便本机方法也可以在1d数组中生成正确的索引

爪哇:

// 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 :(得分:1)

这些都在JNI文档中。以下是关于如何在JNI中使用多维数组以及二维数组上的示例的说明: http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jnistring.html#multi