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