jamie@133: jamie@134: %include "../xtract.i" jamie@133: %include "arrays_java.i" jamie@134: jamie@154: %apply double[] {const double *data}; jamie@154: %apply double *OUTPUT { double *result }; jamie@134: %typemap(in,numinputs=0) JNIEnv *env "$1 = jenv;" jamie@134: jamie@154: %javamethodmodifiers arr2voidd "private"; jamie@134: %javamethodmodifiers arr2voidi "private"; jamie@154: %javamethodmodifiers freearrd "private"; jamie@134: %javamethodmodifiers freearri "private"; jamie@154: jamie@134: %inline %{ jamie@154: jlong arr2voidd(JNIEnv *env, jdoubleArray arr) { jamie@134: void *ptr = (*env)->GetFloatArrayElements(env, arr, NULL); jamie@134: return (intptr_t)ptr; jamie@134: } jamie@134: jamie@154: void freearrd(JNIEnv *env, jdoubleArray 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@154: if (o instanceof double[]) { jamie@154: return arr2voidd((double[])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@154: if (o instanceof double[]) { jamie@154: freearrd((double[])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: %include xtract_redeclare.i jamie@134: