作者sbrhsieh (十年~)
看板java
标题Re: [问题] JNI的问题
时间Mon Mar 11 00:40:38 2013
※ 引述《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