簡體   English   中英

JNI中的2D陣列

[英]2D Arrays in JNI

我試圖將2D字符數組作為Java代碼的參數,將其復制到C語言的數組中,並在C代碼中使用該數組,如下所示:

JNIEXPORT void JNICALL Java_Map_fillMap(JNIEnv *env, jobject thisObj, jcharArray mapFromJava) {
    jsize len = (*env)->GetArrayLength(env, mapFromJava);
    jchar *mapArray = (*env)->GetCharArrayElements(env, mapFromJava, 0);
    int size = sizeof(char) * 19 * 9;
    memcpy(map, mapArray, size);

}當我嘗試打印2d數組時,我得到的雜物似乎來自.dll庫文件。

EDIT1當前僅將第一個值存儲到每個第二維數組。 我不確定如何獲得第二個for循環遍歷此維度並使用memcpy復制每個元素。

JNIEXPORT void JNICALL Java_CGameLogic_fillMap(JNIEnv *env, jobject thisObj, jobjectArray mapFromJava) {
int i;
for(i=0; i<len1; i++) {
     jcharArray array = (*env)->GetObjectArrayElement(env,mapFromJava, i);
     int len2 =(*env)->GetArrayLength(env, array);
     jchar *mapArray = (*env)->GetCharArrayElements(env, array, 0);
     int j;
     for (j=0;j< len2; j++) {
         memcpy(map[i], mapArray, sizeof(char));
     }
  }
}

我至少可以看到兩個問題:

  1. 您假設mapFromJavajcharArray ,但事實並非如此。 如果Java類型為char[][]則對應的JNI類型為jobjectArray ,並且該jobjectArray中的每個元素都是jcharArray

  2. 您似乎假設charjchar具有相同的大小,但是它們可能不相同。 jchar是一個無符號的16位整數類型。 char通常是8位類型(盡管它可能因平台而異)。

我不知道那些魔術數字19和9來自何處。 您應該使用GetArrayLength返回的長度。

如果參數mapFromJava是2D字符數組,則它應該是jobjectArray 那么它的每個元素都是一個char[] 因此,您需要遍歷mapFromJava的元素,訪問1D數組並將其元素添加到內存中。

jsize len = (*env)->GetArrayLength(env, mapFromJava);
for(int i=0; i<len1; i++) {
     jcharArray array = (jcharArray)env->GetObjectArrayElement(mapFromJava, i);
     // extract the chars from array
}

問題解決了,我忘記了mapArray將容納該給定數組的所有元素,因此sizeof(char)需要足夠大以容納數組中的所有字符。 例如(sizeof(char)* len2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM