javahead.swg 4.1 KB

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