mirror of
https://github.com/zeromq/libzmq.git
synced 2024-12-27 15:41:05 +08:00
Add Java binding
This commit is contained in:
parent
0aacee389f
commit
1f06d99a0f
@ -8,5 +8,9 @@ if BUILD_RUBY
|
||||
DIR_R = ruby
|
||||
endif
|
||||
|
||||
SUBDIRS = src perf $(DIR_P) $(DIR_R)
|
||||
DIST_SUBDIRS = src perf $(DIR_P) $(DIR_R)
|
||||
if BUILD_JAVA
|
||||
DIR_J = java
|
||||
endif
|
||||
|
||||
SUBDIRS = src perf $(DIR_P) $(DIR_R) $(DIR_J)
|
||||
DIST_SUBDIRS = src perf $(DIR_P) $(DIR_R) $(DIR_J)
|
||||
|
54
configure.in
54
configure.in
@ -259,7 +259,58 @@ if test "x$pyzmq" != "xyes"; then
|
||||
[python third-party/openpgm/libpgm-1.0.0/openpgm/pgm/version_generator.py > \
|
||||
third-party/openpgm/libpgm-1.0.0/openpgm/pgm/version.c])
|
||||
|
||||
# Java language binding
|
||||
jzmq="no"
|
||||
AC_ARG_WITH([java], [AS_HELP_STRING([--with-java], [build Java language binding [default=no]])], [with_java=yes], [with_java=no])
|
||||
if test "x$with_java" != "xno"; then
|
||||
AC_PATH_PROG(JAVAC, javac, "no",[$PATH:$JAVA_HOME/bin])
|
||||
if test "x$JAVAC" = "xno"; then
|
||||
AC_MSG_ERROR([To run configure with --with-java option, javac has to be on the path.]);
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(JAVAH, javah, "no",[$PATH:$JAVA_HOME/bin])
|
||||
if test "x$JAVAH" = "xno"; then
|
||||
AC_MSG_ERROR([To run configure with --with-java option, javah has to be on the path.]);
|
||||
fi
|
||||
|
||||
AC_PATH_PROG(JAR, jar, "no", [$PATH:$JAVA_HOME/bin])
|
||||
if test "x$JAR" = "xno"; then
|
||||
AC_MSG_ERROR([To run configure with --with-java option, jar has to be on the path.]);
|
||||
fi
|
||||
|
||||
if test "x$JAVA_HOME" = "x"; then
|
||||
AC_MSG_ERROR([To run configure with --with-java, please set the JAVA_HOME variable to your JDK environment.]);
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([for jni.h in a $JAVA_HOME/include dir])
|
||||
if test -f $JAVA_HOME/include/jni.h; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_ERROR([Could not find jni.h in $JAVA_HOME/include directory.]);
|
||||
fi
|
||||
|
||||
JAVAROOT=./
|
||||
AC_SUBST(JAVAROOT)
|
||||
|
||||
case "${host_os}" in
|
||||
*solaris*)
|
||||
JAVA_INCLUDE="-I.. -I${JAVA_HOME}/include -I ${JAVA_HOME}/include/solaris"
|
||||
;;
|
||||
*openbsd*)
|
||||
JAVA_INCLUDE="-I.. -I${JAVA_HOME}/include -I ${JAVA_HOME}/include/openbsd"
|
||||
;;
|
||||
*)
|
||||
JAVA_INCLUDE="-I.. -I${JAVA_HOME}/include -I ${JAVA_HOME}/include/linux"
|
||||
;;
|
||||
esac
|
||||
|
||||
AC_SUBST(JAVA_INCLUDE)
|
||||
|
||||
jzmq="yes"
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(BUILD_PYTHON, test "x$pyzmq" = "xyes")
|
||||
AM_CONDITIONAL(BUILD_JAVA, test "x$jzmq" = "xyes")
|
||||
|
||||
AC_SUBST(stdint)
|
||||
AC_SUBST(inttypes)
|
||||
@ -276,7 +327,7 @@ AC_TYPE_SIGNAL
|
||||
AC_CHECK_FUNCS(perror gettimeofday memset socket getifaddrs freeifaddrs)
|
||||
|
||||
AC_OUTPUT(Makefile src/Makefile python/Makefile python/setup.py ruby/Makefile \
|
||||
perf/Makefile perf/c/Makefile perf/cpp/Makefile)
|
||||
java/Makefile perf/Makefile perf/c/Makefile perf/cpp/Makefile)
|
||||
|
||||
AC_MSG_RESULT([])
|
||||
AC_MSG_RESULT([ ******************************************************** ])
|
||||
@ -294,5 +345,6 @@ AC_MSG_RESULT([ Ruby language binding: $rbzmq])
|
||||
if test "x$rbzmq" = "xyes"; then
|
||||
AC_MSG_RESULT([ Ruby library install dir: $rubydir])
|
||||
fi
|
||||
AC_MSG_RESULT([ Java language binding: $jzmq])
|
||||
AC_MSG_RESULT([])
|
||||
|
||||
|
92
java/Context.cpp
Normal file
92
java/Context.cpp
Normal file
@ -0,0 +1,92 @@
|
||||
/*
|
||||
Copyright (c) 2007-2009 FastMQ Inc.
|
||||
|
||||
This file is part of 0MQ.
|
||||
|
||||
0MQ is free software; you can redistribute it and/or modify it under
|
||||
the terms of the Lesser GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
0MQ is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
Lesser GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the Lesser GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "zmq.h"
|
||||
#include "org_zmq_Context.h"
|
||||
|
||||
static jfieldID ctx_handle_fid = NULL;
|
||||
|
||||
static void
|
||||
raise_exception (JNIEnv *env, int err)
|
||||
{
|
||||
// Get exception class.
|
||||
jclass exception_class = env->FindClass ("java/lang/Exception");
|
||||
assert (exception_class);
|
||||
|
||||
// Get text description of the exception.
|
||||
const char *err_msg = strerror (err);
|
||||
|
||||
// Raise the exception.
|
||||
int rc = env->ThrowNew (exception_class, err_msg);
|
||||
assert (rc == 0);
|
||||
|
||||
// Free the local ref.
|
||||
env->DeleteLocalRef (exception_class);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Context_construct (JNIEnv *env, jobject obj,
|
||||
jint app_threads, jint io_threads)
|
||||
{
|
||||
if (ctx_handle_fid == NULL) {
|
||||
jclass cls = env->GetObjectClass (obj);
|
||||
assert (cls);
|
||||
ctx_handle_fid = env->GetFieldID (cls, "contextHandle", "J");
|
||||
assert (ctx_handle_fid);
|
||||
env->DeleteLocalRef (cls);
|
||||
}
|
||||
|
||||
void *ctx = zmq_init (app_threads, io_threads);
|
||||
if (ctx == NULL) {
|
||||
raise_exception (env, errno);
|
||||
return;
|
||||
}
|
||||
|
||||
env->SetLongField (obj, ctx_handle_fid, (jlong) ctx);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Context_finalize (JNIEnv *env, jobject obj)
|
||||
{
|
||||
void *ctx = (void*) env->GetLongField (obj, ctx_handle_fid);
|
||||
assert (ctx);
|
||||
|
||||
int rc = zmq_term (ctx);
|
||||
assert (rc == 0);
|
||||
}
|
||||
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_org_zmq_Context_createSocket (JNIEnv *env, jobject obj, jint type)
|
||||
{
|
||||
void *ctx = (void*) env->GetLongField (obj, ctx_handle_fid);
|
||||
assert (ctx);
|
||||
|
||||
void *s = zmq_socket (ctx, type);
|
||||
if (s == NULL) {
|
||||
raise_exception (env, errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return (jlong) s;
|
||||
}
|
72
java/Makefile.am
Normal file
72
java/Makefile.am
Normal file
@ -0,0 +1,72 @@
|
||||
# We do not want to install Jzmq.class file
|
||||
# user has to copy it to the right location.
|
||||
#jzmqdir = /tmp
|
||||
|
||||
jarfile = Zmq.jar
|
||||
jardir = $(datadir)/java
|
||||
|
||||
$(jarfile): $(dist_noinst_JAVA)
|
||||
$(JAR) cf $(JARFLAGS) $@ org/zmq/*.class
|
||||
|
||||
jar_DATA = $(jarfile)
|
||||
|
||||
dist_noinst_JAVA = \
|
||||
org/zmq/Context.java \
|
||||
org/zmq/Socket.java \
|
||||
org/zmq/Message.java
|
||||
|
||||
lib_LTLIBRARIES = libjzmq.la
|
||||
libjzmq_la_SOURCES = \
|
||||
Context.cpp \
|
||||
org_zmq_Context.h \
|
||||
Socket.cpp \
|
||||
org_zmq_Socket.h \
|
||||
Message.cpp \
|
||||
org_zmq_Message.h
|
||||
|
||||
libjzmq_la_CXXFLAGS = -I$(top_builddir)/src/libzmq \
|
||||
@JAVA_INCLUDE@ -I$(top_builddir)/include -I$(top_srcdir)/libjzmq -Wall -I /usr/lib/jvm/java-6-openjdk/include
|
||||
libjzmq_la_LDFLAGS = -version-info 0:0:0
|
||||
libjzmq_la_LIBADD = $(top_builddir)/src/libzmq.la
|
||||
|
||||
BUILT_SOURCES = \
|
||||
org/zmq/Context.class \
|
||||
org_zmq_Context.h \
|
||||
org/zmq/Socket.class \
|
||||
org_zmq_Socket.h \
|
||||
org/zmq/Message.class \
|
||||
org_zmq_Message.h
|
||||
|
||||
CLEANFILES = \
|
||||
org/zmq/Context.class \
|
||||
org_zmq_Context.h \
|
||||
org/zmq/Socket.class \
|
||||
org_zmq_Socket.h \
|
||||
org/zmq/Message.class \
|
||||
org_zmq_Message.h \
|
||||
Zmq.jar
|
||||
|
||||
$(srcdir)/Context.cpp: org_zmq_Context.h
|
||||
|
||||
org_zmq_Context.h: org/zmq/Context.class
|
||||
$(CLASSPATH_ENV) $(JAVAH) -jni -classpath . org.zmq.Context
|
||||
|
||||
./org/zmq/Context.class: classdist_noinst.stamp
|
||||
|
||||
$(srcdir)/Socket.cpp: org_zmq_Socket.h
|
||||
|
||||
org_zmq_Socket.h: org/zmq/Socket.class
|
||||
$(CLASSPATH_ENV) $(JAVAH) -jni -classpath . org.zmq.Socket
|
||||
|
||||
./org/zmq/Socket.class: classdist_noinst.stamp
|
||||
|
||||
$(srcdir)/Message.cpp: org_zmq_Message.h
|
||||
|
||||
org_zmq_Message.h: org/zmq/Message.class
|
||||
$(CLASSPATH_ENV) $(JAVAH) -jni -classpath . org.zmq.Message
|
||||
|
||||
./org/zmq/Message.class: classdist_noinst.stamp
|
||||
|
||||
dist-hook:
|
||||
-rm $(distdir)/*.h
|
||||
|
138
java/Message.cpp
Normal file
138
java/Message.cpp
Normal file
@ -0,0 +1,138 @@
|
||||
/*
|
||||
Copyright (c) 2007-2009 FastMQ Inc.
|
||||
|
||||
This file is part of 0MQ.
|
||||
|
||||
0MQ is free software; you can redistribute it and/or modify it under
|
||||
the terms of the Lesser GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
0MQ is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
Lesser GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the Lesser GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "zmq.h"
|
||||
#include "org_zmq_Message.h"
|
||||
|
||||
static jfieldID msg_handle_fid = NULL;
|
||||
|
||||
static void
|
||||
raise_exception (JNIEnv *env, int err)
|
||||
{
|
||||
// Get exception class.
|
||||
jclass exception_class = env->FindClass ("java/lang/Exception");
|
||||
assert (exception_class);
|
||||
|
||||
// Get text description of the exception.
|
||||
const char *err_msg = strerror (err);
|
||||
|
||||
// Raise the exception.
|
||||
int rc = env->ThrowNew (exception_class, err_msg);
|
||||
assert (rc == 0);
|
||||
|
||||
// Free the local ref.
|
||||
env->DeleteLocalRef (exception_class);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Message_construct (JNIEnv *env, jobject obj)
|
||||
{
|
||||
if (msg_handle_fid == NULL) {
|
||||
jclass cls = env->GetObjectClass (obj);
|
||||
assert (cls != NULL);
|
||||
msg_handle_fid = env->GetFieldID (cls, "msgHandle", "J");
|
||||
assert (msg_handle_fid != NULL);
|
||||
env->DeleteLocalRef (cls);
|
||||
}
|
||||
|
||||
zmq_msg_t *msg = (zmq_msg_t*) malloc (sizeof (zmq_msg_t));
|
||||
if (msg == NULL) {
|
||||
raise_exception (env, ENOMEM);
|
||||
return;
|
||||
}
|
||||
|
||||
int rc = zmq_msg_init (msg);
|
||||
assert (rc == 0);
|
||||
env->SetLongField (obj, msg_handle_fid, (jlong) msg);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Message_constructWithData (JNIEnv *env, jobject obj,
|
||||
jbyteArray payload)
|
||||
{
|
||||
if (msg_handle_fid == NULL) {
|
||||
jclass cls = env->GetObjectClass (obj);
|
||||
assert (cls != NULL);
|
||||
msg_handle_fid = env->GetFieldID (cls, "msgHandle", "J");
|
||||
assert (msg_handle_fid != NULL);
|
||||
env->DeleteLocalRef (cls);
|
||||
}
|
||||
|
||||
zmq_msg_t *msg = (zmq_msg_t*) malloc (sizeof (zmq_msg_t));
|
||||
if (msg == NULL) {
|
||||
raise_exception (env, ENOMEM);
|
||||
return;
|
||||
}
|
||||
|
||||
jsize array_size = env->GetArrayLength (payload);
|
||||
jbyte *array_data = env->GetByteArrayElements (payload, NULL);
|
||||
|
||||
int rc = zmq_msg_init_size (msg, array_size);
|
||||
assert (rc == 0);
|
||||
|
||||
memcpy (zmq_msg_data (msg), array_data, array_size);
|
||||
env->ReleaseByteArrayElements (payload, array_data, JNI_ABORT);
|
||||
|
||||
env->SetLongField (obj, msg_handle_fid, (jlong) msg);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Message_finalize (JNIEnv *env, jobject obj)
|
||||
{
|
||||
zmq_msg_t *msg = (zmq_msg_t*) env->GetLongField (obj, msg_handle_fid);
|
||||
assert (msg);
|
||||
|
||||
int rc = zmq_msg_close (msg);
|
||||
assert (rc == 0);
|
||||
|
||||
free (msg);
|
||||
}
|
||||
|
||||
JNIEXPORT jbyteArray JNICALL
|
||||
Java_org_zmq_Message_getMsgPayload (JNIEnv *env, jobject obj)
|
||||
{
|
||||
zmq_msg_t *msg = (zmq_msg_t*) env->GetLongField (obj, msg_handle_fid);
|
||||
assert (msg);
|
||||
|
||||
jsize msg_size = zmq_msg_size (msg);
|
||||
jbyte *msg_data = (jbyte*) zmq_msg_data (msg);
|
||||
|
||||
jbyteArray payload = env->NewByteArray (msg_size);
|
||||
if (payload == NULL)
|
||||
return NULL;
|
||||
|
||||
env->SetByteArrayRegion (payload, 0, msg_size, msg_data);
|
||||
assert (!env->ExceptionCheck ());
|
||||
|
||||
return payload;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_org_zmq_Message_getMsgType (JNIEnv *env, jobject obj)
|
||||
{
|
||||
zmq_msg_t *msg = (zmq_msg_t*) env->GetLongField (obj, msg_handle_fid);
|
||||
assert (msg);
|
||||
|
||||
return (jint) zmq_msg_type (msg);
|
||||
}
|
276
java/Socket.cpp
Normal file
276
java/Socket.cpp
Normal file
@ -0,0 +1,276 @@
|
||||
/*
|
||||
Copyright (c) 2007-2009 FastMQ Inc.
|
||||
|
||||
This file is part of 0MQ.
|
||||
|
||||
0MQ is free software; you can redistribute it and/or modify it under
|
||||
the terms of the Lesser GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
0MQ is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
Lesser GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the Lesser GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "zmq.h"
|
||||
#include "org_zmq_Socket.h"
|
||||
|
||||
static jfieldID socket_handle_fid = NULL;
|
||||
static jclass msg_class = NULL;
|
||||
static jmethodID msg_constructor;
|
||||
static jmethodID get_msg_handle_mid = NULL;
|
||||
static jmethodID create_socket_mid = NULL;
|
||||
|
||||
static void
|
||||
raise_exception (JNIEnv *env, int err)
|
||||
{
|
||||
// Get exception class.
|
||||
jclass exception_class = env->FindClass ("java/lang/Exception");
|
||||
assert (exception_class);
|
||||
|
||||
// Get text description of the exception.
|
||||
const char *err_msg = strerror (err);
|
||||
|
||||
// Raise the exception.
|
||||
int rc = env->ThrowNew (exception_class, err_msg);
|
||||
assert (rc == 0);
|
||||
|
||||
// Free the local ref.
|
||||
env->DeleteLocalRef (exception_class);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_construct (JNIEnv *env, jobject obj, jobject context,
|
||||
jint type)
|
||||
{
|
||||
if (socket_handle_fid == NULL) {
|
||||
jclass cls = env->GetObjectClass (obj);
|
||||
assert (cls);
|
||||
socket_handle_fid = env->GetFieldID (cls, "socketHandle", "J");
|
||||
assert (socket_handle_fid);
|
||||
env->DeleteLocalRef (cls);
|
||||
}
|
||||
|
||||
if (create_socket_mid == NULL) {
|
||||
jclass cls = env->FindClass ("org/zmq/Context");
|
||||
assert (cls);
|
||||
create_socket_mid = env->GetMethodID (cls, "createSocket", "(I)J");
|
||||
assert (create_socket_mid);
|
||||
env->DeleteLocalRef (cls);
|
||||
}
|
||||
|
||||
if (msg_class == NULL) {
|
||||
jclass cls = env->FindClass ("org/zmq/Message");
|
||||
assert (cls);
|
||||
|
||||
msg_constructor = env->GetMethodID (cls, "<init>", "()V");
|
||||
assert (msg_constructor);
|
||||
|
||||
get_msg_handle_mid = env->GetMethodID (cls, "getMsgHandle", "()J");
|
||||
assert (get_msg_handle_mid);
|
||||
|
||||
msg_class = (jclass) env->NewGlobalRef (cls);
|
||||
assert (msg_class);
|
||||
env->DeleteLocalRef (cls);
|
||||
}
|
||||
|
||||
void *s = (void *) env->CallLongMethod (context, create_socket_mid, type);
|
||||
if (env->ExceptionCheck ())
|
||||
return;
|
||||
|
||||
env->SetLongField (obj, socket_handle_fid, (jlong) s);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_finalize (JNIEnv *env, jobject obj)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
int rc = zmq_close (s);
|
||||
assert (rc == 0);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_setHwm (JNIEnv *env, jobject obj, jlong hwm)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
int rc = zmq_setsockopt (s, ZMQ_HWM, &hwm, sizeof hwm);
|
||||
if (rc == -1)
|
||||
raise_exception (env, errno);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_setLwm (JNIEnv *env, jobject obj, jlong lwm)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
int rc = zmq_setsockopt (s, ZMQ_LWM, &lwm, sizeof lwm);
|
||||
if (rc == -1)
|
||||
raise_exception (env, errno);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_setSwap (JNIEnv *env, jobject obj, jlong swap_size)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
int rc = zmq_setsockopt (s, ZMQ_SWAP, &swap_size, sizeof swap_size);
|
||||
if (rc == -1)
|
||||
raise_exception (env, errno);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_setMask (JNIEnv *env, jobject obj, jlong mask)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
int rc = zmq_setsockopt (s, ZMQ_MASK, &mask, sizeof mask);
|
||||
if (rc == -1)
|
||||
raise_exception (env, errno);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_setAffinity (JNIEnv *env, jobject obj, jlong affinity)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
int rc = zmq_setsockopt (s, ZMQ_AFFINITY, &affinity, sizeof affinity);
|
||||
if (rc == -1)
|
||||
raise_exception (env, errno);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_setIdentity (JNIEnv *env, jobject obj, jstring identity)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
if (identity == NULL) {
|
||||
raise_exception (env, EINVAL);
|
||||
return;
|
||||
}
|
||||
|
||||
const char *c_identity = env->GetStringUTFChars (identity, NULL);
|
||||
if (c_identity == NULL)
|
||||
return;
|
||||
|
||||
int rc = zmq_setsockopt (s, ZMQ_IDENTITY, c_identity, sizeof c_identity);
|
||||
env->ReleaseStringUTFChars (identity, c_identity);
|
||||
|
||||
if (rc == -1)
|
||||
raise_exception (env, errno);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_bind (JNIEnv *env, jobject obj, jstring addr)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
if (addr == NULL) {
|
||||
raise_exception (env, EINVAL);
|
||||
return;
|
||||
}
|
||||
|
||||
const char *c_addr = env->GetStringUTFChars (addr, NULL);
|
||||
if (c_addr == NULL)
|
||||
return;
|
||||
|
||||
int rc = zmq_bind (s, c_addr);
|
||||
env->ReleaseStringUTFChars (addr, c_addr);
|
||||
|
||||
if (rc == -1)
|
||||
raise_exception (env, errno);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_connect (JNIEnv *env, jobject obj, jstring addr)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
if (addr == NULL) {
|
||||
raise_exception (env, EINVAL);
|
||||
return;
|
||||
}
|
||||
|
||||
const char *c_addr = env->GetStringUTFChars (addr, NULL);
|
||||
if (c_addr == NULL)
|
||||
return;
|
||||
|
||||
int rc = zmq_connect (s, c_addr);
|
||||
env->ReleaseStringUTFChars (addr, c_addr);
|
||||
|
||||
if (rc == -1)
|
||||
raise_exception (env, errno);
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_org_zmq_Socket_send (JNIEnv *env, jobject obj, jobject msg, jlong flags)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
zmq_msg_t *zmq_msg = (zmq_msg_t *)
|
||||
env->CallLongMethod (msg, get_msg_handle_mid);
|
||||
|
||||
if (env->ExceptionCheck ())
|
||||
return -1;
|
||||
|
||||
int rc = zmq_send (s, zmq_msg, (int) flags);
|
||||
if (rc == -1) {
|
||||
raise_exception (env, errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_org_zmq_Socket_flush (JNIEnv *env, jobject obj)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
zmq_flush (s);
|
||||
}
|
||||
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_org_zmq_Socket_recv (JNIEnv *env, jobject obj, jlong flags)
|
||||
{
|
||||
void *s = (void*) env->GetLongField (obj, socket_handle_fid);
|
||||
assert (s);
|
||||
|
||||
jobject msg = env->NewObject (msg_class, msg_constructor);
|
||||
if (msg == NULL)
|
||||
return NULL;
|
||||
|
||||
zmq_msg_t *zmq_msg = (zmq_msg_t*)
|
||||
env->CallLongMethod (msg, get_msg_handle_mid);
|
||||
|
||||
if (env->ExceptionCheck ())
|
||||
return NULL;
|
||||
|
||||
int rc = zmq_recv (s, zmq_msg, (int) flags);
|
||||
if (rc == -1) {
|
||||
raise_exception (env, errno);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
47
java/org/zmq/Context.java
Normal file
47
java/org/zmq/Context.java
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
Copyright (c) 2007-2009 FastMQ Inc.
|
||||
|
||||
This file is part of 0MQ.
|
||||
|
||||
0MQ is free software; you can redistribute it and/or modify it under
|
||||
the terms of the Lesser GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
0MQ is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
Lesser GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the Lesser GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.zmq;
|
||||
|
||||
public class Context {
|
||||
static {
|
||||
System.loadLibrary("jzmq");
|
||||
}
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param appThreads maximum number of application threads.
|
||||
* @param ioThreads size of the threads pool to handle I/O operations.
|
||||
*/
|
||||
public Context (int appThreads, int ioThreads) {
|
||||
construct (appThreads, ioThreads);
|
||||
}
|
||||
|
||||
public native long createSocket (int type);
|
||||
|
||||
/** Initialize the JNI interface */
|
||||
protected native void construct (int appThreads, int ioThreads);
|
||||
|
||||
/** Free resources used by JNI driver. */
|
||||
protected native void finalize ();
|
||||
|
||||
/** Opaque data used by JNI driver. */
|
||||
private long contextHandle;
|
||||
}
|
66
java/org/zmq/Message.java
Normal file
66
java/org/zmq/Message.java
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
Copyright (c) 2007-2009 FastMQ Inc.
|
||||
|
||||
This file is part of 0MQ.
|
||||
|
||||
0MQ is free software; you can redistribute it and/or modify it under
|
||||
the terms of the Lesser GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
0MQ is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
Lesser GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the Lesser GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.zmq;
|
||||
|
||||
public class Message {
|
||||
static {
|
||||
System.loadLibrary("jzmq");
|
||||
}
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*/
|
||||
public Message () {
|
||||
construct ();
|
||||
}
|
||||
|
||||
public Message (byte [] payload) {
|
||||
constructWithData (payload);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get message payload.
|
||||
*/
|
||||
public native byte [] getMsgPayload ();
|
||||
|
||||
/**
|
||||
* Get message type.
|
||||
*/
|
||||
public native int getMsgType ();
|
||||
|
||||
/**
|
||||
* Get low-level message handler.
|
||||
*/
|
||||
public long getMsgHandle () {
|
||||
return msgHandle;
|
||||
}
|
||||
|
||||
/** Initialize the JNI interface */
|
||||
protected native void construct ();
|
||||
|
||||
protected native void constructWithData (byte [] payload);
|
||||
|
||||
/** Free resources used by JNI driver. */
|
||||
protected native void finalize ();
|
||||
|
||||
/** Opaque data used by JNI driver. */
|
||||
private long msgHandle;
|
||||
}
|
||||
|
141
java/org/zmq/Socket.java
Normal file
141
java/org/zmq/Socket.java
Normal file
@ -0,0 +1,141 @@
|
||||
/*
|
||||
Copyright (c) 2007-2009 FastMQ Inc.
|
||||
|
||||
This file is part of 0MQ.
|
||||
|
||||
0MQ is free software; you can redistribute it and/or modify it under
|
||||
the terms of the Lesser GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
0MQ is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
Lesser GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the Lesser GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.zmq;
|
||||
|
||||
public class Socket {
|
||||
static {
|
||||
System.loadLibrary("jzmq");
|
||||
}
|
||||
|
||||
public static final int ZMQ_MAX_VSM_SIZE = 30;
|
||||
|
||||
public static final int ZMQ_GAP = 1;
|
||||
|
||||
public static final int ZMQ_DELIMITER = 31;
|
||||
|
||||
public static final int ZMQ_NOBLOCK = 1;
|
||||
|
||||
public static final int ZMQ_NOFLUSH = 2;
|
||||
|
||||
public static final int ZMQ_P2P = 0;
|
||||
|
||||
public static final int ZMQ_PUB = 1;
|
||||
|
||||
public static final int ZMQ_SUB = 2;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
*
|
||||
* @param context
|
||||
* @param type
|
||||
*/
|
||||
public Socket (Context context, int type) {
|
||||
ctx = context;
|
||||
construct (context, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the high watermark on the socket.
|
||||
*
|
||||
* @param hwm high watermark.
|
||||
*/
|
||||
public native void setHwm (long hwm);
|
||||
|
||||
/**
|
||||
* Set the low watermark on the socket.
|
||||
*
|
||||
* @param lwm low watermark.
|
||||
*/
|
||||
public native void setLwm (long lwm);
|
||||
|
||||
/**
|
||||
* Set swap size.
|
||||
*
|
||||
* @param swap_size swap size.
|
||||
*/
|
||||
public native void setSwap (long swap_size);
|
||||
|
||||
/**
|
||||
* Set reception mask.
|
||||
*
|
||||
* @param mask mask.
|
||||
*/
|
||||
public native void setMask (long mask);
|
||||
|
||||
/**
|
||||
* Set affinity.
|
||||
*
|
||||
* @param affinity
|
||||
*/
|
||||
public native void setAffinity (long affinity);
|
||||
|
||||
/**
|
||||
* Set identity.
|
||||
*
|
||||
* @param identity
|
||||
*/
|
||||
public native void setIdentity (String identity);
|
||||
|
||||
/**
|
||||
* @param addr
|
||||
*/
|
||||
public native void bind (String addr);
|
||||
|
||||
/**
|
||||
* Connect.
|
||||
*
|
||||
* @param addr
|
||||
*/
|
||||
public native void connect (String addr);
|
||||
|
||||
/**
|
||||
* Send.
|
||||
*
|
||||
* @param message
|
||||
* @param block
|
||||
*/
|
||||
public native int send (Message msg, long flags);
|
||||
|
||||
/**
|
||||
* Flush all messages sent with flush flag false down the stream.
|
||||
*/
|
||||
public native void flush ();
|
||||
|
||||
/**
|
||||
* Receive message.
|
||||
*
|
||||
* @param block
|
||||
* @return
|
||||
*/
|
||||
public native Message recv (long flags);
|
||||
|
||||
/** Initialize JNI driver */
|
||||
protected native void construct (Context context, int type);
|
||||
|
||||
/** Free all resources used by JNI driver. */
|
||||
protected native void finalize ();
|
||||
|
||||
/** Keep reference to ZMQ context so it is not garbage collected */
|
||||
private Context ctx;
|
||||
|
||||
/** Opaque data used by JNI driver. */
|
||||
private long socketHandle;
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user