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

4

我在这里向您征求关于我的问题的建议。我是一个新手,昨天开始遇到这个问题,但一直无法解决。 我正在尝试在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
这是为了查找数组大小而编写的太多代码了。你不应该发布所有的代码,只需发布最小量的代码来演示你的问题即可。 - Coeffect
按照您的建议,我已经完成了@Coeffect的任务。 - Srinath K
1个回答

3
假设jfilePaths是在Java中声明为String[][]的2D字符串数组:
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...
    }
}

嗨samgak,非常感谢您提供了出色的解决方案。 - Srinath K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接