jamie@133: jamie@134: %include "../xtract.i" jamie@133: %include "arrays_java.i" jamie@134: jamie@134: /* jamie@134: %{ jamie@134: int mean(const float *data, const int N, void *in, float *result) { jamie@134: return xtract_mean(data, N, in, result); jamie@134: } jamie@134: %} jamie@134: */ jamie@134: %apply float[] {const float *data}; jamie@134: /*%apply void *in {const void *argv}; */ jamie@134: %apply float *OUTPUT { float *result }; jamie@134: %typemap(in,numinputs=0) JNIEnv *env "$1 = jenv;" jamie@134: jamie@134: %javamethodmodifiers arr2voidf "private"; jamie@134: %javamethodmodifiers arr2voidi "private"; jamie@134: %javamethodmodifiers freearrf "private"; jamie@134: %javamethodmodifiers freearri "private"; jamie@134: %inline %{ jamie@134: jlong arr2voidf(JNIEnv *env, jfloatArray arr) { jamie@134: void *ptr = (*env)->GetFloatArrayElements(env, arr, NULL); jamie@134: return (intptr_t)ptr; jamie@134: } jamie@134: jamie@134: void freearrf(JNIEnv *env, jfloatArray arr, jlong map) { jamie@134: void *ptr = 0; jamie@134: ptr = *(void **)↦ jamie@134: (*env)->ReleaseFloatArrayElements(env, arr, ptr, JNI_ABORT); jamie@134: } jamie@134: jamie@134: jlong arr2voidi(JNIEnv *env, jintArray arr) { jamie@134: void *ptr = (*env)->GetIntArrayElements(env, arr, NULL); jamie@134: return (intptr_t)ptr; jamie@134: } jamie@134: jamie@134: void freearri(JNIEnv *env, jintArray arr, jlong map) { jamie@134: void *ptr = 0; jamie@134: ptr = *(void **)↦ jamie@134: (*env)->ReleaseIntArrayElements(env, arr, ptr, JNI_ABORT); jamie@134: } jamie@134: %} jamie@134: jamie@134: jamie@134: %pragma(java) modulecode=%{ jamie@134: private static long arrPtr(Object o) { jamie@134: if (o instanceof float[]) { jamie@134: return arr2voidf((float[])o); jamie@134: } jamie@134: else if (o instanceof int[]) { jamie@134: return arr2voidi((int[])o); jamie@134: } jamie@134: else if (o == null) { jamie@134: return 0L; jamie@134: } jamie@134: throw new IllegalArgumentException(); jamie@134: } jamie@134: jamie@134: private static void freeArrPtr(Object o, long addr) { jamie@134: if (o instanceof float[]) { jamie@134: freearrf((float[])o, addr); jamie@134: return; jamie@134: } jamie@134: else if (o instanceof int[]) { jamie@134: freearri((int[])o, addr); jamie@134: return; jamie@134: } jamie@134: else if (o == null) { jamie@134: return; jamie@134: } jamie@134: throw new IllegalArgumentException(); jamie@134: } jamie@134: %} jamie@134: jamie@134: %typemap(jstype) void *argv "Object" jamie@134: %typemap(javain,pre=" long tmp$javainput = arrPtr($javainput);",post=" freeArrPtr($javainput, tmp$javainput);") void *argv "tmp$javainput" jamie@134: jamie@134: /* jamie@134: int xtract_mean(const float *data, const int N, void *argv, float *result); jamie@134: int xtract_variance(const float *data, const int N, void *argv, float *result); jamie@134: */ jamie@134: %include xtract_redeclare.i jamie@134: jamie@134: /*%{ jamie@134: #include "xtract/xtract_scalar.h" jamie@134: %}*/