annotate 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
rev   line source
jamie@133 1
jamie@134 2 %include "../xtract.i"
jamie@133 3 %include "arrays_java.i"
jamie@134 4
jamie@134 5 /*
jamie@134 6 %{
jamie@134 7 int mean(const float *data, const int N, void *in, float *result) {
jamie@134 8 return xtract_mean(data, N, in, result);
jamie@134 9 }
jamie@134 10 %}
jamie@134 11 */
jamie@134 12 %apply float[] {const float *data};
jamie@134 13 /*%apply void *in {const void *argv}; */
jamie@134 14 %apply float *OUTPUT { float *result };
jamie@134 15 %typemap(in,numinputs=0) JNIEnv *env "$1 = jenv;"
jamie@134 16
jamie@134 17 %javamethodmodifiers arr2voidf "private";
jamie@134 18 %javamethodmodifiers arr2voidi "private";
jamie@134 19 %javamethodmodifiers freearrf "private";
jamie@134 20 %javamethodmodifiers freearri "private";
jamie@134 21 %inline %{
jamie@134 22 jlong arr2voidf(JNIEnv *env, jfloatArray arr) {
jamie@134 23 void *ptr = (*env)->GetFloatArrayElements(env, arr, NULL);
jamie@134 24 return (intptr_t)ptr;
jamie@134 25 }
jamie@134 26
jamie@134 27 void freearrf(JNIEnv *env, jfloatArray arr, jlong map) {
jamie@134 28 void *ptr = 0;
jamie@134 29 ptr = *(void **)&map;
jamie@134 30 (*env)->ReleaseFloatArrayElements(env, arr, ptr, JNI_ABORT);
jamie@134 31 }
jamie@134 32
jamie@134 33 jlong arr2voidi(JNIEnv *env, jintArray arr) {
jamie@134 34 void *ptr = (*env)->GetIntArrayElements(env, arr, NULL);
jamie@134 35 return (intptr_t)ptr;
jamie@134 36 }
jamie@134 37
jamie@134 38 void freearri(JNIEnv *env, jintArray arr, jlong map) {
jamie@134 39 void *ptr = 0;
jamie@134 40 ptr = *(void **)&map;
jamie@134 41 (*env)->ReleaseIntArrayElements(env, arr, ptr, JNI_ABORT);
jamie@134 42 }
jamie@134 43 %}
jamie@134 44
jamie@134 45
jamie@134 46 %pragma(java) modulecode=%{
jamie@134 47 private static long arrPtr(Object o) {
jamie@134 48 if (o instanceof float[]) {
jamie@134 49 return arr2voidf((float[])o);
jamie@134 50 }
jamie@134 51 else if (o instanceof int[]) {
jamie@134 52 return arr2voidi((int[])o);
jamie@134 53 }
jamie@134 54 else if (o == null) {
jamie@134 55 return 0L;
jamie@134 56 }
jamie@134 57 throw new IllegalArgumentException();
jamie@134 58 }
jamie@134 59
jamie@134 60 private static void freeArrPtr(Object o, long addr) {
jamie@134 61 if (o instanceof float[]) {
jamie@134 62 freearrf((float[])o, addr);
jamie@134 63 return;
jamie@134 64 }
jamie@134 65 else if (o instanceof int[]) {
jamie@134 66 freearri((int[])o, addr);
jamie@134 67 return;
jamie@134 68 }
jamie@134 69 else if (o == null) {
jamie@134 70 return;
jamie@134 71 }
jamie@134 72 throw new IllegalArgumentException();
jamie@134 73 }
jamie@134 74 %}
jamie@134 75
jamie@134 76 %typemap(jstype) void *argv "Object"
jamie@134 77 %typemap(javain,pre=" long tmp$javainput = arrPtr($javainput);",post=" freeArrPtr($javainput, tmp$javainput);") void *argv "tmp$javainput"
jamie@134 78
jamie@134 79 /*
jamie@134 80 int xtract_mean(const float *data, const int N, void *argv, float *result);
jamie@134 81 int xtract_variance(const float *data, const int N, void *argv, float *result);
jamie@134 82 */
jamie@134 83 %include xtract_redeclare.i
jamie@134 84
jamie@134 85 /*%{
jamie@134 86 #include "xtract/xtract_scalar.h"
jamie@134 87 %}*/