changeset 134:5810fb03cacc

SWIG Java bindings improvements Much-improved Java bindings. Java arrays can now be passed to functions that take void *, without any special treatment.
author Jamie Bullock <jamie@postlude.co.uk>
date Mon, 18 Jun 2012 21:38:14 +0100
parents 15bc88384ecd
children bdb43920e3bb
files Makefile.am swig/java/Makefile.am swig/java/jxtract.i swig/java/test.java swig/xtract.i
diffstat 5 files changed, 126 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.am	Wed Jun 13 15:08:11 2012 +0100
+++ b/Makefile.am	Mon Jun 18 21:38:14 2012 +0100
@@ -16,7 +16,8 @@
 	     autogen.sh \
 	     README.md \
 	     TODO \
-	     $(SWIG_DIR)/java/SWIG.java \
-	     $(SWIG_DIR)/java/test.java \
+	     $(SWIG_DIR)/java/*.java \
+	     $(SWIG_DIR)/java/xtract/core/src/* \
 	     $(SWIG_DIR)/python/test.py \
 	     $(SWIG_DIR)/python/__init__.py
+
--- a/swig/java/Makefile.am	Wed Jun 13 15:08:11 2012 +0100
+++ b/swig/java/Makefile.am	Mon Jun 18 21:38:14 2012 +0100
@@ -1,7 +1,5 @@
 
 javasources = \
-	floatArray.java \
-	intArray.java \
 	SWIGTYPE_p_float.java \
 	SWIGTYPE_p_int.java \
 	SWIGTYPE_p_p_float.java \
@@ -34,8 +32,6 @@
 
 	
 javaclasses = \
-	floatArray.class \
-	intArray.class \
 	SWIGTYPE_p_float.class \
 	SWIGTYPE_p_int.class \
 	SWIGTYPE_p_p_float.class \
@@ -64,23 +60,6 @@
 	xtract_unit_t.class \
 	xtract_vector_t.class \
 	xtract_window_types_.class 
-	
-nonautojavasources = SWIG.java
-nonautojavaclasses = SWIG.class
-
-#javasources = \
-#	xtractJNI.java \
-#	xtract.java \
-#	floatArray.java \
-#	SWIGTYPE_p_float.java \
-#	SWIGTYPE_p_void.java   
-
-#javaclasses = \
-#	xtractJNI.class \
-#	xtract.class \
-#	floatArray.class \
-#	SWIGTYPE_p_float.class \
-#	SWIGTYPE_p_void.class   
 
 MAINTAINERCLEANFILES = $(javasources) Makefile.in
 
@@ -95,18 +74,24 @@
 
 SWIG_JAVA_OPT = -java -package xtract.core
 
-xtract_wrap.c : $(SWIG_SOURCES)
+xtract_wrap.c: $(SWIG_SOURCES)
+	grep xtract_.*\(const $(top_srcdir)/xtract/xtract_* | grep argv | cut -d: -f 2 | sed 's/const void/void/g' > xtract_redeclare.i
 	$(SWIG) $(SWIG_JAVA_OPT) -I$(top_srcdir) -o $@ $<
-	$(JAVAC) $(nonautojavasources) $(javasources)
 	mkdir -p xtract/core
 	mkdir -p xtract/core/src
 	mv $(javasources) xtract/core/src
-	mv $(javaclasses) xtract/core
-	cp $(nonautojavasources) xtract/core/src
-	cp $(nonautojavaclasses) xtract/core
+
+java-wrap:
+	cd xtract/core/src && $(JAVAC) $(javasources)
+	cd xtract/core/src && mv $(javaclasses) ../
+
+test:
 	$(JAVAC) test.java
 
+all-local: java-wrap test
+
 clean-local:
-	-rm -f libjxtract.so xtract_wrap.c $(javasources) $(javaclasses) $(nonautojavaclasses) test.class
+	-rm xtract_redeclare.i 
+	-rm -f libjxtract.so xtract_wrap.c test.class xtract_subband_scales_.java #$(javasources) $(javaclasses) $(nonautojavaclasses) test.class xtract_subband_scales_.java
 	-rm -rf xtract
 
--- a/swig/java/jxtract.i	Wed Jun 13 15:08:11 2012 +0100
+++ b/swig/java/jxtract.i	Mon Jun 18 21:38:14 2012 +0100
@@ -1,3 +1,87 @@
 
+%include "../xtract.i"
 %include "arrays_java.i"
-%include "../xtract.i"
+
+/*
+%{
+int mean(const float *data, const int N, void *in, float *result) {
+    return xtract_mean(data, N, in, result);
+}
+%}
+*/
+%apply float[] {const float *data};
+/*%apply void *in {const void *argv}; */
+%apply float *OUTPUT { float *result };
+%typemap(in,numinputs=0) JNIEnv *env "$1 = jenv;"
+
+%javamethodmodifiers arr2voidf "private";
+%javamethodmodifiers arr2voidi "private";
+%javamethodmodifiers freearrf "private";
+%javamethodmodifiers freearri "private";
+%inline %{
+jlong arr2voidf(JNIEnv *env, jfloatArray arr) {
+  void *ptr = (*env)->GetFloatArrayElements(env, arr, NULL);
+  return (intptr_t)ptr;
+}
+
+void freearrf(JNIEnv *env, jfloatArray arr, jlong map) {
+  void *ptr = 0;
+  ptr = *(void **)&map;
+  (*env)->ReleaseFloatArrayElements(env, arr, ptr, JNI_ABORT);
+}
+
+jlong arr2voidi(JNIEnv *env, jintArray arr) {
+  void *ptr = (*env)->GetIntArrayElements(env, arr, NULL);
+  return (intptr_t)ptr;
+}
+
+void freearri(JNIEnv *env, jintArray arr, jlong map) {
+  void *ptr = 0;
+  ptr = *(void **)&map;
+  (*env)->ReleaseIntArrayElements(env, arr, ptr, JNI_ABORT);
+}
+%}
+
+
+%pragma(java) modulecode=%{
+  private static long arrPtr(Object o) {
+    if (o instanceof float[]) {
+      return arr2voidf((float[])o);
+    }
+    else if (o instanceof int[]) {
+      return arr2voidi((int[])o);
+    }
+    else if (o == null) {
+        return 0L;
+    }
+    throw new IllegalArgumentException();
+  }
+
+  private static void freeArrPtr(Object o, long addr) {
+    if (o instanceof float[]) {
+      freearrf((float[])o, addr);
+      return;
+    }
+    else if (o instanceof int[]) {
+      freearri((int[])o, addr);
+      return;
+    }
+    else if (o == null) {
+        return;
+    }
+    throw new IllegalArgumentException();
+  }
+%}
+
+%typemap(jstype) void *argv "Object"
+%typemap(javain,pre="    long tmp$javainput = arrPtr($javainput);",post="      freeArrPtr($javainput, tmp$javainput);") void *argv "tmp$javainput"
+
+/*
+int xtract_mean(const float *data, const int N, void *argv, float *result);
+int xtract_variance(const float *data, const int N, void *argv, float *result);
+*/
+%include xtract_redeclare.i
+
+/*%{
+#include "xtract/xtract_scalar.h"
+%}*/
--- a/swig/java/test.java	Wed Jun 13 15:08:11 2012 +0100
+++ b/swig/java/test.java	Mon Jun 18 21:38:14 2012 +0100
@@ -1,42 +1,36 @@
 
 import xtract.core.*;
+import java.util.Arrays;
 
 public class test {
     public static void main(String argv[]) {
 
-	try {
-	    System.loadLibrary("jxtract");
-	}
-	catch (UnsatisfiedLinkError e) {
-	    System.out.println("Failed to load the library \"jxtract\"");
-	    System.out.println(e.toString());
+        try {
+            System.loadLibrary("jxtract");
+        }
+        catch (UnsatisfiedLinkError e) {
+            System.out.println("Failed to load the library \"jxtract\"");
+            System.out.println(e.toString());
             System.exit(0);
-	}
+        }
 
-	System.out.println("\nRunning libxtract Java bindings test...\n");
+        System.out.println("\nRunning libxtract Java bindings test...\n");
 
-        int len = 5;
-        int retval = 0;
-        float mean[] = new float[1];
+        int len          = 5;
+        int retval       = 0;
+        float mean[]     = new float[1];
         float variance[] = new float[1];
-        float[] a = new float[len];
-        floatArray av = new floatArray(1);
-        variance = new float[1];
-
-	System.out.print("The mean of: ");
+        float data[]     = new float[len];
 
         for (int i = 0; i < len; i++){
-	    System.out.print(i * 3 + ", ");
-            a[i] = i * 3;
-	}
+            System.out.print(i * 3 + ", ");
+            data[i] = i * 3;
+        }
 
-        retval = xtract.xtract_mean(a, len, av.cast().getVoidPointer(), mean);
+        retval = xtract.xtract_mean(data, len, null, mean);
+        retval = xtract.xtract_variance(data, len, mean, variance);
 
-        System.out.print("is " + mean[0] + "\n");
-
-        av.setitem(0, mean[0]);
-        retval = xtract.xtract_variance(a, len, av.cast().getVoidPointer(), variance);
-        System.out.print("The variance is: " + variance[0] + "\n");
-
+        System.out.print("The mean of: " + Arrays.toString(data) + " is "
+                + mean[0] + "\nThe variance is: " + variance[0] + "\n");
     }
 }
--- a/swig/xtract.i	Wed Jun 13 15:08:11 2012 +0100
+++ b/swig/xtract.i	Mon Jun 18 21:38:14 2012 +0100
@@ -1,6 +1,8 @@
 %module xtract
 %include typemaps.i
+/*
 %include carrays.i 
+*/
 
 %{
 #include "xtract/xtract_scalar.h"
@@ -16,7 +18,7 @@
 %newobject create_filterbank; 
 %delobject destroy_filterbank; 
 
-
+/*
 %typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [],
     SWIGTYPE (CLASS::*) "SWIG"
 
@@ -26,7 +28,7 @@
             return swigCPtr;
         }
 %}
-
+*/
 /* Helper functions */
 %inline %{
 
@@ -101,7 +103,8 @@
 %array_class(float, floatArray); 
 %array_class(int, intArray); 
 %apply float *OUTPUT { float *result };
-%apply float[] {const float *data};
+
+/* %apply float[] {const float *data}; */
 
 
 %ignore xtract;