diff options
-rw-r--r-- | Makefile.am | 5 | ||||
-rw-r--r-- | swig/java/Makefile.am | 39 | ||||
-rw-r--r-- | swig/java/jxtract.i | 86 | ||||
-rw-r--r-- | swig/java/test.java | 46 | ||||
-rw-r--r-- | swig/xtract.i | 9 |
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 **)↦ + (*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 **)↦ + (*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; |