diff swig/java/jxtract.i @ 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 826eb46b2f91
line wrap: on
line diff
--- 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"
+%}*/