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