2012-10-06 60 views
2

如何發送指向從JNI C代碼到Java代碼的數組的指針?例如:如何發送從JNI C代碼到數組的指針到Java代碼?

JNI的C代碼:

jclass cls = (*env)->GetObjectClass(env,obj); 
jmethodID mid = (*env)->GetMethodID(env,cls,"print"," ?? "); // What should be the signature here ? 
jvalue a1,*arr; 
a1.i = 2002; 
a1.f = 12.90; 
a1.c = 's'; 
a1.j = 344554; 
a1.b = TRUE; 
arr = &a1; 
(*env)->CallVoidMethodA(env,obj,mid,arr); 

的Java FUNC:

public void print(?????) { // what should be the argument here ? 
    // add code here 
} 

應該如何在Java函數查找希望收到一個指針數組?

+3

@auselen在所有關於SO的問題上留下這個評論(這個家庭作業是我想寫的一些模塊的準備工作)下一次嘗試給出更好的答案,這樣你就不會得到** 2 downvotes ** .. –

+0

有沒有什麼特別的原因讓你爲什麼使用'CallVoidMethodA()'而不是更簡單的'CallVoidMethod()'? – maba

回答

1

首先,兩個問題與您的代碼:

  1. arr實際上不是一個數組(它指向一個單一jvalue),因此,因此沒有理由通過指針,而不是隻按值傳遞。
  2. 所有這些a1.X分配是無用的,除了最後一個,因爲jvalue聯合所有可能的基元和引用類型。

下一頁:將原始C指針傳遞給JNI是不可能的(可以,但您只能讓Java將指針看作數字而不是對象)。您必須創建一個Java數組或緩衝區對象。數組很好,如果你要創建一個引用數組,雖然內存將不得不被複制;如果您希望C數組與Java緩衝區共享內存,那麼緩衝區很好。