changeset 133:15bc88384ecd

Java SWIG bindings improvements
author Jamie Bullock <jamie@postlude.co.uk>
date Wed, 13 Jun 2012 15:08:11 +0100
parents 4b65e92da473
children 5810fb03cacc
files Makefile.am configure.ac swig/java/Makefile.am swig/java/SWIG.java swig/java/jxtract.i swig/java/test.java swig/xtract.i
diffstat 7 files changed, 71 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile.am	Sun Jun 10 12:11:15 2012 +0100
+++ b/Makefile.am	Wed Jun 13 15:08:11 2012 +0100
@@ -11,4 +11,12 @@
 
 ACLOCAL_AMFLAGS = -I m4
 
-EXTRA_DIST = examples/MSP bootstrap autogen.sh README TODO
+EXTRA_DIST = examples/MSP \
+	     bootstrap \
+	     autogen.sh \
+	     README.md \
+	     TODO \
+	     $(SWIG_DIR)/java/SWIG.java \
+	     $(SWIG_DIR)/java/test.java \
+	     $(SWIG_DIR)/python/test.py \
+	     $(SWIG_DIR)/python/__init__.py
--- a/configure.ac	Sun Jun 10 12:11:15 2012 +0100
+++ b/configure.ac	Wed Jun 13 15:08:11 2012 +0100
@@ -4,7 +4,7 @@
 # Increment for feature additions and enhancements
 m4_define(libxtract_minor_version, 6)
 # Increment for fixes 
-m4_define(libxtract_fix_version, 5)
+m4_define(libxtract_fix_version, 6)
 # Development status
 m4_define(libIntegra_dev_status, [beta])
 
@@ -195,7 +195,7 @@
 
 dnl SWIG stuff
 if [[ "$swig" = "true" ]] ; then
-    AX_PKG_SWIG(1.3.21)
+    AX_PKG_SWIG(1.3.21, [], [ AC_MSG_ERROR([SWIG is not installed]) ])
     AC_DEFINE([BUILD_SWIG], [1], [Build the swig bindings])
 fi
 
--- a/swig/java/Makefile.am	Sun Jun 10 12:11:15 2012 +0100
+++ b/swig/java/Makefile.am	Wed Jun 13 15:08:11 2012 +0100
@@ -30,6 +30,8 @@
 	xtract_unit_t.java \
 	xtract_vector_t.java \
 	xtract_window_types_.java 
+
+
 	
 javaclasses = \
 	floatArray.class \
@@ -63,6 +65,8 @@
 	xtract_vector_t.class \
 	xtract_window_types_.class 
 	
+nonautojavasources = SWIG.java
+nonautojavaclasses = SWIG.class
 
 #javasources = \
 #	xtractJNI.java \
@@ -81,26 +85,28 @@
 MAINTAINERCLEANFILES = $(javasources) Makefile.in
 
 BUILT_SOURCES = $(srcdir)/xtract_wrap.c
-SWIG_SOURCES = ../xtract.i
+SWIG_SOURCES = jxtract.i
 
 lib_LTLIBRARIES = libjxtract.la
 libjxtract_la_SOURCES = $(srcdir)/xtract_wrap.c $(SWIG_SOURCES)
 libjxtract_la_CFLAGS = $(SWIG_PYTHON_CPPFLAGS) -I$(top_srcdir)/src
-libjxtract_la_LDFLAGS = -module -lxtract
+libjxtract_la_LDFLAGS = -lxtract
 libjxtract_la_LIBADD = $(top_srcdir)/src/libxtract.la
 
 SWIG_JAVA_OPT = -java -package xtract.core
 
 xtract_wrap.c : $(SWIG_SOURCES)
 	$(SWIG) $(SWIG_JAVA_OPT) -I$(top_srcdir) -o $@ $<
-	$(JAVAC) $(javasources)
+	$(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
 	$(JAVAC) test.java
 
 clean-local:
-	-rm -f libjxtract.so xtract_wrap.c $(javasources) $(javaclasses) test.class
+	-rm -f libjxtract.so xtract_wrap.c $(javasources) $(javaclasses) $(nonautojavaclasses) test.class
 	-rm -rf xtract
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/swig/java/SWIG.java	Wed Jun 13 15:08:11 2012 +0100
@@ -0,0 +1,16 @@
+package xtract.core;
+
+public abstract class SWIG {
+  protected abstract long getPointer();
+
+  public boolean equals(Object obj) {
+    boolean equal = false;
+    if (obj instanceof SWIG)
+      equal = (((SWIG)obj).getPointer() == this.getPointer());
+    return equal;
+  }
+  
+  public SWIGTYPE_p_void getVoidPointer() {
+    return new SWIGTYPE_p_void(getPointer(), false);
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/swig/java/jxtract.i	Wed Jun 13 15:08:11 2012 +0100
@@ -0,0 +1,3 @@
+
+%include "arrays_java.i"
+%include "../xtract.i"
--- a/swig/java/test.java	Sun Jun 10 12:11:15 2012 +0100
+++ b/swig/java/test.java	Wed Jun 13 15:08:11 2012 +0100
@@ -10,32 +10,33 @@
 	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");
 
         int len = 5;
         int retval = 0;
-        float result[];
-        floatArray a = new floatArray(len);
-        SWIGTYPE_p_void myvoid = null;
-
-        result = new float[1];
+        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: ");
 
         for (int i = 0; i < len; i++){
-	    System.out.print(i * 2 + ", ");
-            a.setitem(i, i * 2);
+	    System.out.print(i * 3 + ", ");
+            a[i] = i * 3;
 	}
 
-	System.out.print("is: ");
+        retval = xtract.xtract_mean(a, len, av.cast().getVoidPointer(), mean);
 
-        retval = xtract.xtract_mean(a.cast(), len, myvoid, result);
+        System.out.print("is " + mean[0] + "\n");
 
-        System.out.print(result[0] + "\n");
-
-	System.out.println("\nFinished!\n\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");
 
     }
 }
--- a/swig/xtract.i	Sun Jun 10 12:11:15 2012 +0100
+++ b/swig/xtract.i	Wed Jun 13 15:08:11 2012 +0100
@@ -1,6 +1,6 @@
 %module xtract
+%include typemaps.i
 %include carrays.i 
-%include typemaps.i
 
 %{
 #include "xtract/xtract_scalar.h"
@@ -17,9 +17,24 @@
 %delobject destroy_filterbank; 
 
 
+%typemap(javabase) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [],
+    SWIGTYPE (CLASS::*) "SWIG"
+
+%typemap(javacode) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE [],
+    SWIGTYPE (CLASS::*) %{
+        protected long getPointer() {
+            return swigCPtr;
+        }
+%}
+
 /* Helper functions */
 %inline %{
 
+    void *floata_to_voidp(float f[])
+    {
+        return (void *)f;
+    }
+
     xtract_function_descriptor_t 
             *get_descriptor(xtract_function_descriptor_t *fd, int i){
 
@@ -86,7 +101,8 @@
 %array_class(float, floatArray); 
 %array_class(int, intArray); 
 %apply float *OUTPUT { float *result };
-/* %apply float *INPUT { float *data }; */
+%apply float[] {const float *data};
+
 
 %ignore xtract;