This looks simple enough. I should be able to port this into a jzmq
branch fairly easily.

I'll likely do it over the weekend.

-Trev

On Fri, Feb 15, 2013 at 1:55 PM, gonzalo diethelm <gdieth...@dcv.cl> wrote:
> I remembered that I did implement this for a tentative Java binding for 
> Crossroads IO. The relevant methods where send() and recv(). This all worked 
> and performed MUCH better that current binding. Some details follow; if more 
> is required, let me know.
>
> Usage:
>
>             int size = 128;
>             ByteBuffer bb = ByteBuffer.allocateDirect(size);
> ...
>             int rc = xs.xs_recv(sock, bb, 0, size, 0);
> ...
>             int rc = xs.xs_recv(sock, bb, 0, size, 0);
>
> ---------------------
> In Java:
>
> public class XsLibrary {
> ...
>     public native int xs_send(long socket,
>                               ByteBuffer buffer,
>                               int offset,
>                               int length,
>                               int flags);
>     public native int xs_recv(long socket,
>                               ByteBuffer buffer,
>                               int offset,
>                               int length,
>                               int flags);
> }
>
> ---------------------
> In C (the JNI part):
>
> JNIEXPORT jint JNICALL Java_io_crossroads_jni_XsLibrary_xs_1send(JNIEnv* env,
>                                                                  jobject obj,
>                                                                  jlong socket,
>                                                                  jobject 
> buffer,
>                                                                  jint offset,
>                                                                  jint length,
>                                                                  jint flags)
> {
>     void* sock = 0;
>     jbyte* buf = 0;
>     int ret = 0;
>
>     sock = (void*) socket;
>     XS_ASSERT(sock);
>     buf = (jbyte*) (*env)->GetDirectBufferAddress(env, buffer);
>     XS_ASSERT(buf);
>     ret = xs_send(sock, buf, length, flags);
>     return ret;
> }
>
> JNIEXPORT jint JNICALL Java_io_crossroads_jni_XsLibrary_xs_1recv(JNIEnv* env,
>                                                                  jobject obj,
>                                                                  jlong socket,
>                                                                  jobject 
> buffer,
>                                                                  jint offset,
>                                                                  jint length,
>                                                                  jint flags)
> {
>     void* sock = 0;
>     jbyte* buf = 0;
>     int ret = 0;
>
>     sock = (void*) socket;
>     XS_ASSERT(sock);
>     buf = (jbyte*) (*env)->GetDirectBufferAddress(env, buffer);
>     XS_ASSERT(buf);
>     ret = xs_recv(sock, buf, length, flags);
>     return ret;
> }
>
> ---------------------
>
> --
> Gonzalo Diethelm
> DCV Chile
>
>
>> -----Original Message-----
>> From: zeromq-dev-boun...@lists.zeromq.org [mailto:zeromq-dev-
>> boun...@lists.zeromq.org] On Behalf Of Trevor Bernard
>> Sent: Friday, February 15, 2013 2:02 PM
>> To: thecarro...@jiminger.com; ZeroMQ development list
>> Subject: Re: [zeromq-dev] Zero Copy in Java jzmq
>>
>> > I'm thinking of extending jzmq to optionally allow the zero-copy
>> > technique using the concepts outlined by Martin Thompson here:
>>
>> That's awesome
>>
>> > I'm not 100% sure I'll do it, I need some more experimentation first,
>> > but is there any interest or words of advice if someone's tried this
>> > already?
>>
>> I'd love for send/recv to have a ByteBuffer API.
>>
>> Some resources and general suggestions:
>>
>> Have a peak at zmq_msg_t in zmq.h.
>>
>> Defines ZMTP/2.0 Spec:
>> * http://rfc.zeromq.org/spec:15
>>
>> Also depending on the size of the msg, it may be allocated on the stack or
>> heap.
>> * http://api.zeromq.org/3-2:zmq-msg-init-size
>>
>> At some point you'll have to access a malloc'ed array from Java/JNI.
>> *
>> http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.
>> html#nio_support
>>
>> Something like this would do the trick. This wraps a native pointer in a
>> ByteBufer
>>
>> void *data = ...
>> jobject bb = (*env)->NewDirectByteBuffer(env, (void*) data,
>> sizeof(zmq_msg_t));
>>
>> Here is another option: Use a library like javolution to do your mapping:
>>
>> http://javolution.org/target/site/apidocs/javolution/io/Struct.html
>>
>> class Message extends Struct {
>>    Unsigned8 _ = new Unsigned8(32);
>>     Message() {
>>         setByteBuffer(Message.nativeBuffer(), 0);
>>     }
>>     private static native ByteBuffer nativeBuffer(); }
>>
>> Something along those lines.
>>
>> Hope this helps.
>>
>> -Trev
>> _______________________________________________
>> zeromq-dev mailing list
>> zeromq-dev@lists.zeromq.org
>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
>
> -----------------------------------------
> Declaración de confidencialidad: Este Mensaje esta destinado para
> el uso de la o las personas o entidades a quien ha sido dirigido y
> puede contener información reservada y confidencial que no puede
> ser divulgada, difundida, ni aprovechada en forma alguna. El uso no
> autorizado de la información contenida en este correo podrá ser
> sancionado de conformidad con la ley chilena.
> Si usted ha recibido este correo electrónico por error, le pedimos
> eliminarlo junto con los archivos adjuntos y avisar inmediatamente
> al remitente, respondiendo este mensaje.
>
> "Before printing this e-mail think if is really necesary".
> Disclosure: This Message is to be used by the individual,
> individuals or entities that it is addressed to and may include
> private and confidential information that may not be disclosed,
> made public nor used in any way at all. Unauthorized use of the
> information in this electronic mail message may be subject to the
> penalties set forth by Chilean law.
> If you have received this electronic mail message in error, we ask
> you to destroy the message and its attached file(s) and to
> immediately notify the sender by answering this message.
_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to