1 /* ----------------------------------------------------------------------------- 2 * javahead.swg 3 * 4 * Java support code 5 * ----------------------------------------------------------------------------- */ 6 7 8 /* JNI function calls require different calling conventions for C and C++. These JCALL macros are used so 9 * that the same typemaps can be used for generating code for both C and C++. The SWIG preprocessor can expand 10 * the macros thereby generating the correct calling convention. It is thus essential that all typemaps that 11 * use the macros are not within %{ %} brackets as they won't be run through the SWIG preprocessor. */ 12 #ifdef __cplusplus 13 # define JCALL0(func, jenv) jenv->func() 14 # define JCALL1(func, jenv, ar1) jenv->func(ar1) 15 # define JCALL2(func, jenv, ar1, ar2) jenv->func(ar1, ar2) 16 # define JCALL3(func, jenv, ar1, ar2, ar3) jenv->func(ar1, ar2, ar3) 17 # define JCALL4(func, jenv, ar1, ar2, ar3, ar4) jenv->func(ar1, ar2, ar3, ar4) 18 # define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) jenv->func(ar1, ar2, ar3, ar4, ar5) 19 # define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6) 20 # define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) jenv->func(ar1, ar2, ar3, ar4, ar5, ar6, ar7) 21 #else 22 # define JCALL0(func, jenv) (*jenv)->func(jenv) 23 # define JCALL1(func, jenv, ar1) (*jenv)->func(jenv, ar1) 24 # define JCALL2(func, jenv, ar1, ar2) (*jenv)->func(jenv, ar1, ar2) 25 # define JCALL3(func, jenv, ar1, ar2, ar3) (*jenv)->func(jenv, ar1, ar2, ar3) 26 # define JCALL4(func, jenv, ar1, ar2, ar3, ar4) (*jenv)->func(jenv, ar1, ar2, ar3, ar4) 27 # define JCALL5(func, jenv, ar1, ar2, ar3, ar4, ar5) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5) 28 # define JCALL6(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6) 29 # define JCALL7(func, jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) (*jenv)->func(jenv, ar1, ar2, ar3, ar4, ar5, ar6, ar7) 30 #endif 31 32 %insert(runtime) %{ 33 /* Fix for jlong on some versions of gcc on Windows */ 34 #if defined(__GNUC__) && !defined(__INTEL_COMPILER) 35 typedef long long __int64; 36 #endif 37 38 /* Fix for jlong on 64-bit x86 Solaris */ 39 #if defined(__x86_64) 40 # ifdef _LP64 41 # undef _LP64 42 # endif 43 #endif 44 45 #include <jni.h> 46 #include <stdlib.h> 47 #include <string.h> 48 %} 49 50 %insert(runtime) %{ 51 /* Support for throwing Java exceptions */ 52 typedef enum { 53 SWIG_JavaOutOfMemoryError = 1, 54 SWIG_JavaIOException, 55 SWIG_JavaRuntimeException, 56 SWIG_JavaIndexOutOfBoundsException, 57 SWIG_JavaArithmeticException, 58 SWIG_JavaIllegalArgumentException, 59 SWIG_JavaNullPointerException, 60 SWIG_JavaDirectorPureVirtual, 61 SWIG_JavaUnknownError 62 } SWIG_JavaExceptionCodes; 63 64 typedef struct { 65 SWIG_JavaExceptionCodes code; 66 const char *java_exception; 67 } SWIG_JavaExceptions_t; 68 %} 69 70 %insert(runtime) { 71 static void SWIGUNUSED SWIG_JavaThrowException(JNIEnv *jenv, SWIG_JavaExceptionCodes code, const char *msg) { 72 jclass excep; 73 static const SWIG_JavaExceptions_t java_exceptions[] = { 74 { SWIG_JavaOutOfMemoryError, "java/lang/OutOfMemoryError" }, 75 { SWIG_JavaIOException, "java/io/IOException" }, 76 { SWIG_JavaRuntimeException, "java/lang/RuntimeException" }, 77 { SWIG_JavaIndexOutOfBoundsException, "java/lang/IndexOutOfBoundsException" }, 78 { SWIG_JavaArithmeticException, "java/lang/ArithmeticException" }, 79 { SWIG_JavaIllegalArgumentException, "java/lang/IllegalArgumentException" }, 80 { SWIG_JavaNullPointerException, "java/lang/NullPointerException" }, 81 { SWIG_JavaDirectorPureVirtual, "java/lang/RuntimeException" }, 82 { SWIG_JavaUnknownError, "java/lang/UnknownError" }, 83 { (SWIG_JavaExceptionCodes)0, "java/lang/UnknownError" } 84 }; 85 const SWIG_JavaExceptions_t *except_ptr = java_exceptions; 86 87 while (except_ptr->code != code && except_ptr->code) 88 except_ptr++; 89 90 JCALL0(ExceptionClear, jenv); 91 excep = JCALL1(FindClass, jenv, except_ptr->java_exception); 92 if (excep) 93 JCALL2(ThrowNew, jenv, excep, msg); 94 } 95 } 96 97 %insert(runtime) %{ 98 /* Contract support */ 99 100 #define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) {SWIG_JavaThrowException(jenv, SWIG_JavaIllegalArgumentException, msg); return nullreturn; } else 101 %} 102