aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Bullock <jamie@postlude.co.uk>2012-06-18 21:38:14 +0100
committerJamie Bullock <jamie@postlude.co.uk>2012-06-18 21:38:14 +0100
commit38947ebbe81dc7301746935b9fa93f38360e5637 (patch)
tree9c849f5ff038e28f968d3593d662bf79aa00ee7c
parent71b96876d1caf0f6d0bfb82be5ca6e68da092c56 (diff)
downloadLibXtract-38947ebbe81dc7301746935b9fa93f38360e5637.tar.gz
LibXtract-38947ebbe81dc7301746935b9fa93f38360e5637.tar.bz2
LibXtract-38947ebbe81dc7301746935b9fa93f38360e5637.zip
SWIG Java bindings improvements
Much-improved Java bindings. Java arrays can now be passed to functions that take void *, without any special treatment.
-rw-r--r--Makefile.am5
-rw-r--r--swig/java/Makefile.am39
-rw-r--r--swig/java/jxtract.i86
-rw-r--r--swig/java/test.java46
-rw-r--r--swig/xtract.i9
5 files changed, 126 insertions, 59 deletions
diff --git a/Makefile.am b/Makefile.am
index 91d4045..48a3919 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -16,7 +16,8 @@ EXTRA_DIST = examples/MSP \
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
+
diff --git a/swig/java/Makefile.am b/swig/java/Makefile.am
index 09a7bfc..26cc5b9 100644
--- a/swig/java/Makefile.am
+++ b/swig/java/Makefile.am
@@ -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 @@ javasources = \
javaclasses = \
- floatArray.class \
- intArray.class \
SWIGTYPE_p_float.class \
SWIGTYPE_p_int.class \
SWIGTYPE_p_p_float.class \
@@ -64,23 +60,6 @@ javaclasses = \
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 @@ libjxtract_la_LIBADD = $(top_srcdir)/src/libxtract.la
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
diff --git a/swig/java/jxtract.i b/swig/java/jxtract.i
index 14b9727..6918436 100644
--- a/swig/java/jxtract.i
+++ b/swig/java/jxtract.i
@@ -1,3 +1,87 @@
-%include "arrays_java.i"
%include "../xtract.i"
+%include "arrays_java.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"
+%}*/
diff --git a/swig/java/test.java b/swig/java/test.java
index ac393a5..54328aa 100644
--- a/swig/java/test.java
+++ b/swig/java/test.java
@@ -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;
- }
-
- retval = xtract.xtract_mean(a, len, av.cast().getVoidPointer(), mean);
-
- System.out.print("is " + mean[0] + "\n");
+ System.out.print(i * 3 + ", ");
+ data[i] = i * 3;
+ }
- av.setitem(0, mean[0]);
- retval = xtract.xtract_variance(a, len, av.cast().getVoidPointer(), variance);
- System.out.print("The variance is: " + variance[0] + "\n");
+ retval = xtract.xtract_mean(data, len, null, mean);
+ retval = xtract.xtract_variance(data, len, mean, variance);
+ System.out.print("The mean of: " + Arrays.toString(data) + " is "
+ + mean[0] + "\nThe variance is: " + variance[0] + "\n");
}
}
diff --git a/swig/xtract.i b/swig/xtract.i
index bf89996..74335c1 100644
--- a/swig/xtract.i
+++ b/swig/xtract.i
@@ -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;