Mercurial > hg > libxtract
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 **)↦ + (*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" +%}*/