You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2012/12/13 13:37:55 UTC

svn commit: r1421258 - in /qpid/proton/branches/jni-binding/proton-c/bindings: ./ java/ java/jni/ java/jni/src/ java/jni/src/main/ java/jni/src/main/java/ java/jni/src/main/java/org/ java/jni/src/main/java/org/apache/ java/jni/src/main/java/org/apache/...

Author: rgodfrey
Date: Thu Dec 13 12:37:53 2012
New Revision: 1421258

URL: http://svn.apache.org/viewvc?rev=1421258&view=rev
Log:
NO-JIRA : Initial commit of cmake / swig for JNI binding

Added:
    qpid/proton/branches/jni-binding/proton-c/bindings/java/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt
    qpid/proton/branches/jni-binding/proton-c/bindings/java/java.i
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/
    qpid/proton/branches/jni-binding/proton-c/bindings/java/jni/src/main/java/org/apache/qpid/proton/jni/
Modified:
    qpid/proton/branches/jni-binding/proton-c/bindings/CMakeLists.txt

Modified: qpid/proton/branches/jni-binding/proton-c/bindings/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-c/bindings/CMakeLists.txt?rev=1421258&r1=1421257&r2=1421258&view=diff
==============================================================================
--- qpid/proton/branches/jni-binding/proton-c/bindings/CMakeLists.txt (original)
+++ qpid/proton/branches/jni-binding/proton-c/bindings/CMakeLists.txt Thu Dec 13 12:37:53 2012
@@ -20,7 +20,7 @@
 include(UseSWIG)
 
 # Add any new bindings here - the directory name must be the same as the binding name
-set (BINDINGS python ruby php perl)
+set (BINDINGS python ruby php perl java)
 
 set (BINDING_DEPS qpid-proton)
 
@@ -58,6 +58,15 @@ if (PERLLIBS_FOUND)
   set (DEFAULT_PERL ON)
 endif (PERLLIBS_FOUND)
 
+# Prerequisites for Java
+find_package( Java )
+if (JAVA_FOUND)
+  find_package( JNI )
+  if (JNI_FOUND)
+    set (DEFAULT_JAVA ON)
+  endif (JNI_FOUND)
+endif (JAVA_FOUND)
+
 # Shouldn't need to modify below here when adding new language binding
 foreach(BINDING ${BINDINGS})
   string(TOUPPER ${BINDING} UBINDING)

Added: qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt?rev=1421258&view=auto
==============================================================================
--- qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt (added)
+++ qpid/proton/branches/jni-binding/proton-c/bindings/java/CMakeLists.txt Thu Dec 13 12:37:53 2012
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+cmake_minimum_required (VERSION 2.6)
+
+project (ProtonJNI C)
+
+SET(CMAKE_SWIG_FLAGS -package org.apache.qpid.proton.jni)
+SET(CMAKE_SWIG_OUTDIR jni/main/java/org/apache/qpid/proton/jni)
+swig_add_module(protonjni java java.i)
+include_directories(${JNI_INCLUDE_DIRS})
+swig_link_libraries(protonjni ${BINDING_DEPS} ${JNI_LIBRARIES} )
+

Added: qpid/proton/branches/jni-binding/proton-c/bindings/java/java.i
URL: http://svn.apache.org/viewvc/qpid/proton/branches/jni-binding/proton-c/bindings/java/java.i?rev=1421258&view=auto
==============================================================================
--- qpid/proton/branches/jni-binding/proton-c/bindings/java/java.i (added)
+++ qpid/proton/branches/jni-binding/proton-c/bindings/java/java.i Thu Dec 13 12:37:53 2012
@@ -0,0 +1,433 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+%module Proton
+%include "arrays_java.i"
+%include "typemaps.i"
+%include "various.i"
+
+
+%{
+/* Includes the header in the wrapper code */
+#include <proton/engine.h>
+#include <proton/message.h>
+#include <proton/sasl.h>
+#include <proton/ssl.h>
+
+#include <proton/driver.h>
+#include <proton/messenger.h>
+
+%}
+
+
+%typemap(in) (char *DATA, size_t SIZE) (char *data, jobject arr, jboolean isDirect) {
+  /* %typemap(in) void * */
+  jclass bbclass = JCALL1(GetObjectClass,jenv, $input);
+  jmethodID isDirectId = JCALL3(GetMethodID,jenv, bbclass, "isDirect", "()Z");
+  jmethodID positionId = JCALL3(GetMethodID,jenv, bbclass, "position", "()I");
+  jmethodID remainingId= JCALL3(GetMethodID,jenv, bbclass, "remaining", "()I");
+  isDirect = JCALL2(CallBooleanMethod,jenv, $input, isDirectId);
+  jint position = JCALL2(CallIntMethod,jenv, $input, positionId);
+  $2 = (long)(JCALL2(CallIntMethod,jenv, $input, remainingId));
+
+  if(isDirect) {
+    $1 = JCALL1(GetDirectBufferAddress,jenv, $input) + position;
+    data = (char *)0;
+    arr = (jobject) 0;
+  } else {
+    jmethodID arrayId= JCALL3(GetMethodID,jenv, bbclass, "array", "()[B");
+    jmethodID arrayOffsetId= JCALL3(GetMethodID,jenv, bbclass, "arrayOffset", "()I");
+    jobject a = JCALL2(CallObjectMethod,jenv, $input, arrayId);
+    arr = a;
+    data = JCALL2(GetPrimitiveArrayCritical, jenv, a, NULL);
+    $1 = data + JCALL2(CallIntMethod,jenv, $input, arrayOffsetId) + position;
+
+  }
+}
+
+%typemap(jni) (char *DATA, size_t SIZE) "jobject"
+%typemap(jtype) (char *DATA, size_t SIZE) "java.nio.ByteBuffer"
+%typemap(jstype) (char *DATA, size_t SIZE) "java.nio.ByteBuffer"
+%typemap(javain) (char *DATA, size_t SIZE) "$javainput"
+%typemap(javaout) (char *DATA, size_t SIZE) {
+
+  return $jnicall;
+}
+
+%typemap(freearg) (char *DATA, size_t SIZE)  {
+
+  if(!isDirect$argnum) {
+    JCALL3(ReleasePrimitiveArrayCritical, jenv, arr$argnum, data$argnum,0);
+  }
+}
+
+
+
+
+%typemap(in) (char *DATA, size_t *SIZE) (char *data, jobject array, jboolean isDirect, jclass bbclass) {
+  /* %typemap(in) void * */
+  bbclass = JCALL1(GetObjectClass,jenv, $input);
+  jmethodID isDirectId = JCALL3(GetMethodID,jenv, bbclass, "isDirect", "()Z");
+  jmethodID positionId = JCALL3(GetMethodID,jenv, bbclass, "position", "()I");
+  jmethodID remainingId= JCALL3(GetMethodID,jenv, bbclass, "remaining", "()I");
+  isDirect = JCALL2(CallBooleanMethod,jenv, $input, isDirectId);
+  jint position = JCALL2(CallIntMethod,jenv, $input, positionId);
+  long size = (long)(JCALL2(CallIntMethod,jenv, $input, remainingId));
+  $2 = &size;
+
+  if(isDirect) {
+    $1 = JCALL1(GetDirectBufferAddress,jenv, $input) + position;
+    data = (char *)0;
+    array = (jobject) 0;
+  } else {
+    jmethodID arrayId= JCALL3(GetMethodID,jenv, bbclass, "array", "()[B");
+    jmethodID arrayOffsetId= JCALL3(GetMethodID,jenv, bbclass, "arrayOffset", "()I");
+    array = JCALL2(CallObjectMethod,jenv, $input, arrayId);
+    //data = JCALL2(GetByteArrayElements, jenv, array, NULL);
+    jobject a = array;
+    data = (char *) JCALL2(GetPrimitiveArrayCritical, jenv, a, NULL);
+    //data = (char *) (*jenv)->GetPrimitiveArrayCritical(jenv, array, NULL);
+    //printf("Acquired  %p from %p\n", data, a);
+
+    $1 = data + JCALL2(CallIntMethod,jenv, $input, arrayOffsetId) + position;
+
+  }
+}
+%typemap(jni) (char *DATA, size_t *SIZE) "jobject"
+%typemap(jtype) (char *DATA, size_t *SIZE) "java.nio.ByteBuffer"
+%typemap(jstype) (char *DATA, size_t *SIZE) "java.nio.ByteBuffer"
+%typemap(javain) (char *DATA, size_t *SIZE) "$javainput"
+%typemap(javaout) (char *DATA, size_t *SIZE) {
+  return $jnicall;
+}
+
+%typemap(freearg) (char *DATA, size_t *SIZE) {
+
+
+  if(!isDirect$argnum) {
+
+    //JCALL3(ReleaseByteArrayElements, jenv, array, $1 - ((*jenv)->CallIntMethod(jenv, $input, arrayOffsetId) + position),0);
+    JCALL3(ReleasePrimitiveArrayCritical, jenv, array$argnum, data$argnum,0);
+    //printf("Releasing %p from %p\n", data$argnum, array$argnum);
+  }
+
+  jmethodID setpositionId = (*jenv)->GetMethodID(jenv, bbclass$argnum, "position", "(I)Ljava/nio/Buffer;");
+
+  jint pos = (int)*$2;
+  // todo - need to increment not just set
+  JCALL3(CallObjectMethod,jenv,$input,setpositionId,pos);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+%rename(pn_connection_get_context) wrap_pn_connection_get_context;
+%inline {
+  jobject wrap_pn_connection_get_context(pn_connection_t *c) {
+    jobject result = (jobject) pn_connection_get_context(c);
+    return result;
+  }
+}
+%ignore pn_connection_get_context;
+
+%native (pn_connection_set_context) void pn_connection_set_context(pn_connection_t, jobject);
+%{
+JNIEXPORT void JNICALL Java_org_apache_qpid_proton_jni_ProtonJNI_pn_1connection_1set_1context(JNIEnv *jenv, jclass jcls,
+                                                              jlong jarg1, jobject context)
+{
+    pn_connection_t *c = *(pn_connection_t **)&jarg1;
+
+    jobject oldContext = (jobject) pn_connection_get_context(c);
+    if(oldContext) {
+      (*jenv)->DeleteGlobalRef(jenv, oldContext);
+    }
+    jobject newContext = NULL;
+    if(context)
+    {
+        newContext = (*jenv)->NewGlobalRef(jenv, context);
+    }
+    pn_connection_set_context(c, newContext);
+
+}
+%}
+%ignore pn_connection_set_context;
+
+
+%rename(pn_session_get_context) wrap_pn_session_get_context;
+%inline {
+  jobject wrap_pn_session_get_context(pn_session_t *c) {
+    jobject result = (jobject) pn_session_get_context(c);
+    return result;
+  }
+}
+%ignore pn_session_get_context;
+
+%native (pn_session_set_context) void pn_session_set_context(pn_session_t, jobject);
+%{
+JNIEXPORT void JNICALL Java_org_apache_qpid_proton_jni_ProtonJNI_pn_1session_1set_1context(JNIEnv *jenv, jclass jcls,
+                                                              jlong jarg1, jobject context)
+{
+    pn_session_t *c = *(pn_session_t **)&jarg1;
+
+    jobject oldContext = (jobject) pn_session_get_context(c);
+    if(oldContext) {
+      (*jenv)->DeleteGlobalRef(jenv, oldContext);
+    }
+    jobject newContext = NULL;
+    if(context)
+    {
+        newContext = (*jenv)->NewGlobalRef(jenv, context);
+    }
+    pn_session_set_context(c, newContext);
+
+}
+%}
+%ignore pn_session_set_context;
+
+%rename(pn_link_get_context) wrap_pn_link_get_context;
+%inline {
+  jobject wrap_pn_link_get_context(pn_link_t *c) {
+    jobject result = (jobject) pn_link_get_context(c);
+    return result;
+  }
+}
+%ignore pn_link_get_context;
+
+%native (pn_link_set_context) void pn_link_set_context(pn_link_t, jobject);
+%{
+JNIEXPORT void JNICALL Java_org_apache_qpid_proton_jni_ProtonJNI_pn_1link_1set_1context(JNIEnv *jenv, jclass jcls,
+                                                              jlong jarg1, jobject context)
+{
+    pn_link_t *c = *(pn_link_t **)&jarg1;
+    void* oldContext = pn_link_get_context(c);
+
+    if(oldContext!=NULL) {
+      (*jenv)->DeleteGlobalRef(jenv, (jobject)oldContext);
+    }
+    jobject newContext = NULL;
+    if(context!=NULL)
+    {
+        newContext = (*jenv)->NewGlobalRef(jenv, context);
+    }
+    pn_link_set_context(c, newContext);
+
+}
+%}
+%ignore pn_link_set_context;
+
+%rename(pn_delivery_get_context) wrap_pn_delivery_get_context;
+%inline {
+  jobject wrap_pn_delivery_get_context(pn_delivery_t *c) {
+    jobject result = (jobject) pn_delivery_get_context(c);
+    return result;
+  }
+}
+%ignore pn_delivery_get_context;
+
+%native (pn_delivery_set_context) void pn_delivery_set_context(pn_delivery_t, jobject);
+%{
+JNIEXPORT void JNICALL Java_org_apache_qpid_proton_jni_ProtonJNI_pn_1delivery_1set_1context(JNIEnv *jenv, jclass jcls,
+                                                              jlong jarg1, jobject context)
+{
+
+    pn_delivery_t *c = *(pn_delivery_t **)&jarg1;
+    jobject oldContext = (jobject) pn_delivery_get_context(c);
+    if(oldContext) {
+      (*jenv)->DeleteGlobalRef(jenv, oldContext);
+    }
+    jobject newContext = NULL;
+    if(context)
+    {
+        newContext = (*jenv)->NewGlobalRef(jenv, context);
+    }
+    pn_delivery_set_context(c, newContext);
+
+}
+%}
+%ignore pn_delivery_set_context;
+
+%native (pn_delivery_tag) jbyteArray pn_delivery_tag(pn_delivery_t);
+%{
+JNIEXPORT jbyteArray JNICALL Java_org_apache_qpid_proton_jni_ProtonJNI_pn_1delivery_1tag(JNIEnv *jenv, jclass jcls,
+                                                              jlong jarg1)
+{
+
+    pn_delivery_t *c = *(pn_delivery_t **)&jarg1;
+    pn_delivery_tag_t tag = pn_delivery_tag(c);
+    jbyteArray rval = (*jenv)->NewByteArray(jenv, tag.size);
+    jbyte* barr = (*jenv)->GetByteArrayElements(jenv, rval, NULL);
+    jint i = 0;
+    for(i=0;i<tag.size;i++)
+    {
+      barr[i] = tag.bytes[i];
+    }
+    (*jenv)->ReleaseByteArrayElements(jenv, rval, barr, 0);
+
+    return (jbyteArray) (*jenv)->NewGlobalRef(jenv, rval);
+
+}
+%}
+%ignore pn_delivery_tag;
+
+%native (pn_bytes_to_array) jbyteArray pn_bytes_to_array(pn_bytes_t);
+%{
+JNIEXPORT jbyteArray JNICALL Java_org_apache_qpid_proton_jni_ProtonJNI_pn_1bytes_1to_1array(JNIEnv *jenv, jclass jcls, jlong jarg1)
+{
+    pn_bytes_t* b = *(pn_bytes_t **)&jarg1;
+    jbyteArray rval = (*jenv)->NewByteArray(jenv, b->size);
+    jbyte* barr = (*jenv)->GetByteArrayElements(jenv, rval, NULL);
+    jint i = 0;
+    for(i=0;i<b->size;i++)
+    {
+      barr[i] = b->start[i];
+    }
+    (*jenv)->ReleaseByteArrayElements(jenv, rval, barr, 0);
+
+    return (jbyteArray) (*jenv)->NewGlobalRef(jenv, rval);
+
+}
+%}
+
+
+
+ssize_t  pn_transport_input(pn_transport_t *transport, char *DATA, size_t SIZE);
+%ignore pn_transport_input;
+
+ssize_t pn_transport_output(pn_transport_t *transport, char *DATA, size_t SIZE);
+%ignore pn_transport_output;
+
+ssize_t pn_link_recv(pn_link_t *receiver, char *DATA, size_t SIZE);
+%ignore pn_link_recv;
+
+ssize_t pn_link_send(pn_link_t *sender, char *DATA, size_t SIZE);
+%ignore pn_link_send;
+
+ssize_t pn_sasl_recv(pn_sasl_t *sasl, char *DATA, size_t SIZE);
+%ignore pn_sasl_recv;
+
+ssize_t pn_sasl_send(pn_sasl_t *sasl, char *DATA, size_t SIZE);
+%ignore pn_sasl_send;
+
+%typemap(jni) char *start "jbyteArray"
+%typemap(jtype) char *start "byte[]"
+%typemap(jstype) char *start "byte[]"
+%typemap(javaout) char *start {
+    return $jnicall;
+}
+
+%typemap(out) char *start {
+    // TODO - RG
+    $result = JCALL1(NewByteArray, jenv, arg1->size);
+    JCALL4(SetByteArrayRegion, jenv, $result, 0, arg1->size, $1);
+}
+
+%typemap(in) char *start {
+    jbyte* barr = (*jenv)->GetByteArrayElements(jenv, $input, NULL);
+    jsize length = (*jenv)->GetArrayLength(jenv, $input);
+    char *buf = malloc(length);
+    jint i = 0;
+    for(i=0;i<length;i++)
+    {
+      buf[i] = barr[i];
+    }
+    (*jenv)->ReleaseByteArrayElements(jenv, $input, barr, 0);
+    $1 = buf;
+}
+%typemap(freearg) char *start  {
+
+}
+
+
+%rename(pn_delivery) wrap_pn_delivery;
+%inline %{
+  pn_delivery_t *wrap_pn_delivery(pn_link_t *link, char *STRING, size_t LENGTH) {
+    return pn_delivery(link, pn_dtag(STRING, LENGTH));
+  }
+%}
+%ignore pn_delivery;
+
+int pn_data_encode(pn_data_t *data, char *DATA, size_t SIZE);
+%ignore pn_data_encode;
+
+int pn_data_decode(pn_data_t *data, char *DATA, size_t SIZE);
+%ignore pn_data_decode;
+
+int pn_message_decode(pn_message_t *msg, char *DATA, size_t SIZE);
+%ignore pn_message_decode;
+
+int pn_message_encode(pn_message_t *msg, char *DATA, size_t *SIZE);
+%ignore pn_message_encode;
+
+int pn_message_load(pn_message_t *msg, char *DATA, size_t SIZE);
+%ignore pn_message_load;
+
+int pn_message_load_data(pn_message_t *msg, char *DATA, size_t SIZE);
+%ignore pn_message_load_data;
+
+int pn_message_load_text(pn_message_t *msg, char *DATA, size_t SIZE);
+%ignore pn_message_load_text;
+
+int pn_message_load_amqp(pn_message_t *msg, char *DATA, size_t SIZE);
+%ignore pn_message_load_amqp;
+
+int pn_message_load_json(pn_message_t *msg, char *DATA, size_t SIZE);
+%ignore pn_message_load_json;
+
+int pn_message_save(pn_message_t *message, char *DATA, size_t *SIZE);
+%ignore pn_message_save;
+
+int pn_message_encode(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE);
+%ignore pn_message_encode;
+
+int pn_message_save(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE);
+%ignore pn_message_save;
+
+int pn_message_save_data(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE);
+%ignore pn_message_save_data;
+
+int pn_message_save_text(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE);
+%ignore pn_message_save_text;
+
+int pn_message_save_amqp(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE);
+%ignore pn_message_save_amqp;
+
+int pn_message_save_json(pn_message_t *msg, char *OUTPUT, size_t *OUTPUT_SIZE);
+%ignore pn_message_save_json;
+
+bool pn_ssl_get_cipher_name(pn_ssl_t *ssl, char *DATA, size_t SIZE);
+%ignore pn_ssl_get_cipher_name;
+
+bool pn_ssl_get_protocol_name(pn_ssl_t *ssl, char *DATA, size_t SIZE);
+%ignore pn_ssl_get_protocol_name;
+
+
+
+
+%include "proton/cproton.i"
+
+



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org