Re: [問題] JNI的問題

看板java作者 (十年~)時間12年前 (2013/03/11 00:40), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《nosrep (真相)》之銘言: : 請問C的函數名稱如下 : int decode(const void *src_data_ptr, short *dest_buf_ptr, int : dest_buf_size) : 要轉給 JAVA呼叫的話,JNI對應的函數參數應該如何對應... : decode的函數會將 src_data_ptr 處理後, 將資料寫回 dest_buf_ptr. : 同時將decode的結果長度回傳. : 其中 src_data_ptr 對應JAVA原始資料型態為: byte[] : dest_buf_ptr: short[] : 目前我自己是轉譯成如下 : jint Java_xxx_decode(JNIEnv *env, jobject thiz, jbyteArray src, : jshortArray dest, jint size); : 以上不知道正不正確? Java native method 與其使用的 native function 的界面沒有一對一的關係, 故沒有絕對的轉譯這回事。實作 native method 的 glue code 只要確保數據 能夠在 Java/native function 之間(雙向)正確地傳遞,以及 method 的界面 在 Java programming 上是否方便使用。 以你所舉的例子來說,你是採用提供最接近 native function 原來的界面的 方式來呈現 java method。由於 java array 本身帶有 length 資訊,那麼 Java_xxx_decode 的最後一個 size 參數是不必要的,可省略。 : 接著我的C對應的問題: : 1.如何取得 src 的 byte資料, 改由 char*去處理? : 2.最終的資料, 如何設定到 dest? 請參閱: Get<Type>ArrayElements Get<Type>ArrayRegion GetPrimitiveArrayCritical Release<Type>ArrayElements Set<Type>ArrayRegion ReleasePrimitiveArrayCritical : 3.效率問題, 我是否可以將 dest 轉成short *, : 並將資料one by one的直接改變到dest的位址? 前半與前兩個問題同。 後半段若是指讓 native function 直接 access Java array object 所使用的 記憶體空間,這不一定可以,視 JVM 的實作而定。 對 GetShortArrayElements/GetPrimitiveArrayCritical 兩者 JVM 都可以選擇 使用副本,不直接 access array object 內部使用的空間。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.172.187.195
文章代碼(AID): #1HFBUAyP (java)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1HFBUAyP (java)