如何在JNI中找到二维数组大小

时间:2015-04-03 02:47:03

标签: java android c++ arrays

我在这里就你的问题得到你的建议。对此我是新的蜜蜂,我从昨天开始就陷入困境,但无法解决。 我试图在JNI中找到2d数组大小,但是没有得到成功的结果。 我有以下代码。你能解决我的问题。

JNIEXPORT jint JNICALL Java_com_example_imagejoiner_MyJoiner_test(JNIEnv*   
      env,
      jobject javaThis) {
   LOGV("test print");
   return 1;
 }
  JNIEXPORT void JNICALL     
  Java_com_example_imagejoiner_MyJoiner_joinNative(JNIEnv* env,
    jobject javaThis, jobjectArray jfilePaths, jstring jfinalImagePath, int   
 verticalOverlapPercent, int horizontalOverlapPercent) {

  const char *finalImagePath = env->GetStringUTFChars(jfinalImagePath, 0);

  const int imageCount = env->GetArrayLength(jfilePaths);
  int rows = 1;
  int columns = 4;

  Mat imageBuff[rows][columns];

  /*for (int i = 0; i < imageCount; i++) {
    jstring filePath = (jstring) env->GetObjectArrayElement( jfilePaths, i);
    const char *rawString = env->GetStringUTFChars(filePath, 0);

    LOGV("reading = %s", rawString);

    imageBuff[i] = imread(rawString, 1);

    if(!imageBuff[i].data) {
        LOGV("failed to read = %s", rawString);
    }

    env->ReleaseStringUTFChars(filePath, rawString);
    }*/

   //Creating a 2 dimensional array from the lieaner array
   int k = 0;
   for (int i = 0; i < rows; i++)
   {
    for (int j = 0; j < columns; j++)
    {
        jstring filePath = (jstring) env->GetObjectArrayElement( jfilePaths,   
      k);

        const char *rawString = env->GetStringUTFChars(filePath, 0);

        LOGV("reading = %s", rawString);

        imageBuff[i][j] = imread(rawString, 1);

        if(!imageBuff[i][j].data) {
            LOGV("failed to read = %s", rawString);
        }
        env->ReleaseStringUTFChars(filePath, rawString);

        k++;
      }
  }

  //Creating a 2 dimensional array from the 2 dimensional array
  /*for (int i = 0; i < rows; i++)
  {
    jstringArray filePath = (jstringArray) env->GetObjectArrayElement(   
      jfilePaths, i);

    for (int j = 0; j < columns; j++)
    {
        const char *rawString = env->GetStringUTFChars(filePath, j);

        LOGV("reading = %s", rawString);

        imageBuff[i][j] = imread(rawString, 1);

        if(!imageBuff[i][j].data) {
            LOGV("failed to read = %s", rawString);
        }

        env->ReleaseStringUTFChars(filePath, rawString);
    }
    }*/

1 个答案:

答案 0 :(得分:2)

假设jfilePaths是在Java中用String[][]声明的二维字符串数组:

2D数组只是一个对象数组,其中每个元素本身就是一个对象数组,每行一个。因此,您可以通过获取2D数组的长度来查找行计数,通过获取第一个对象(将是包含第一行字符串的对象数组)并获取其长度来查找列数。

int rows = env->GetArrayLength(jfilePaths);
jobjectArray firstRow = (jobjectArray)(env->GetObjectArrayElement(jfilePaths, 0));
int columns = env->GetArrayLength(firstRow);

然后你可以像这样遍历行和列:

for(i = 0; i < rows; i++)
{
    jobjectArray currentRow = (jobjectArray)((env->GetObjectArrayElement(jfilePaths, i));
    for(j = 0; j < columns; j++)
    {
        jstring filePath = (jstring)((env->GetObjectArrayElement(currentRow, j));
        const char *rawString = env->GetStringUTFChars(filePath, 0);

        // do stuff...
    }
}