2012-12-14 92 views
0

我有得到一個雙指針雙指針的Android JNI

int getList(unsigned char **list); //it returns a list of something 

我想知道如何從本機代碼(JNI)雙指針傳遞給我的函數等。任何人?

這是我試過的,但它不起作用。

jint Java_test_test_Activity_getList(JNIEnv *env, jobject this, jobjectArray list, jint size){ 
    jint count=0; 
    jbyteArray bArray; 
    jByteArray cList; 
    count=(*env)->GetArrayLength(env, list); 
    for(int i=0; i<count; i++){ 
     bArray[i]=(*env)->GetObjectArrayElement(env, list, i); 
     (*env)->GetByteArrayRegion(env, bArray[i], 0, size, cList[i]); 
    } 

    return getList(cList); 
} 

回答

0

不能使用 '&' 操作,以獲得ADRESS新書jByteArray?

return getList(&cList); 
在C/C++

'&' 給你一個變量(指針)的地址。你可以在指針上使用它來獲得雙指針。 但我不確定jByteArray和unsigned char *之間的轉換是如此簡單,你可能還有別的事情要做。

+0

不太可能,除非Android本機接口與Java的很不相同......要在JVM中獲取指向內存的指針,您需要首先鎖定/鎖定內存。 –

0

雙指針通常不是什麼大問題。你只需要記住所有3層。

  1. 可以直接訪問變量值的圖層。 (例如,int a; a = 3;)
  2. 該圖層將保留一個指向先前定義的變量的指針。 (例如int * p =&a;)
  3. 最後一層是指針指向另一個指針的位置。 (例如int * p2 = & p)

因此,讓我們假設我們在第3級,並且我們使用指針p2。

  1. * p2會給我們指針p。
  2. 現在我們只需要解除引用p就可以得到a,所以* p會給我們a的值。

因此,爲了保持一些東西的雙指針,你需要返回最低層的指針。 (例如(&(&a)))

並且爲了達到需要解除引用兩次的值,如上所述。 (例如*(* ptr))

爲什麼要將jobjectArray元素存儲到jByteArray元素中?

bArray[i]=(*env)->GetObjectArrayElement(env, list, i); 

此外,代替jByteArray欄列表,你可以直接使用C/C++相當,但這可能是不相關的修復你的錯誤。