2015-04-03 38 views
4

在這裏可以從您那裏獲得關於我的問題的建議。這是新的蜜蜂,我從昨天就陷入了這種情況,但無法解決它。 我試圖在JNI中找到2d數組大小,但沒有獲得成功的結果。 我有下面的代碼。請你們能解決我的問題。如何在JNI中找到2維數組大小

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 2015-04-03 02:49:36

+0

因爲你建議我做到了@Coeffect – 2015-04-03 02:57:22

回答

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... 
    } 
} 
+0

嗨samgak ..非常感謝你給出了很好的解決方案。 – 2015-04-07 14:51:03