Re: [問題] JNI的問題
※ 引述《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
討論串 (同標題文章)