WIP: #704 (java directorargout + java/typemaps.i fixes)

- avoid JCALL calls in generated code
- avoid redundant blocks in generated code
diff --git a/Lib/java/java.swg b/Lib/java/java.swg
index 9ed375c..a329411 100644
--- a/Lib/java/java.swg
+++ b/Lib/java/java.swg
@@ -368,7 +368,7 @@
 }
 
 /* Convert to BigInteger (see out typemap) */
-%typemap(directorin, descriptor="Ljava/math/BigInteger;") unsigned long long, const unsigned long long & %{
+%typemap(directorin, descriptor="Ljava/math/BigInteger;", noblock=1) unsigned long long, const unsigned long long & {
 {
   jbyteArray ba = JCALL1(NewByteArray, jenv, 9);
   jbyte* bae = JCALL2(GetByteArrayElements, jenv, ba, 0);
@@ -387,7 +387,7 @@
   JCALL1(DeleteLocalRef, jenv, ba);
   $input = bigint;
 }
-Swig::LocalRefGuard $1_refguard(jenv, $input); %}
+Swig::LocalRefGuard $1_refguard(jenv, $input); }
 
 %typemap(javadirectorin) unsigned long long "$jniinput"
 %typemap(javadirectorout) unsigned long long "$javacall"
@@ -409,14 +409,14 @@
   }
 }
 
-%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * %{
+%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char * {
   $input = 0;
   if ($1) {
     $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
     if (!$input) return $null;
   }
   Swig::LocalRefGuard $1_refguard(jenv, $input);
-%}
+}
 
 %typemap(freearg, noblock=1) char * { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); }
 %typemap(out, noblock=1) char * { if ($1) $result = JCALL1(NewStringUTF, jenv, (const char *)$1); }
@@ -743,14 +743,14 @@
   }
 }
 
-%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char[ANY], char[] %{
+%typemap(directorin, descriptor="Ljava/lang/String;", noblock=1) char[ANY], char[] {
   $input = 0;
   if ($1) {
     $input = JCALL1(NewStringUTF, jenv, (const char *)$1);
     if (!$input) return $null;
   }
   Swig::LocalRefGuard $1_refguard(jenv, $input);
-%}
+}
 
 %typemap(argout) char[ANY], char[] ""
 %typemap(freearg, noblock=1) char[ANY], char[] { if ($1) JCALL2(ReleaseStringUTFChars, jenv, $input, (const char *)$1); }
@@ -1357,12 +1357,15 @@
 %typemap(argout)  (char *STRING, size_t LENGTH) {
   if ($input) JCALL3(ReleaseByteArrayElements, jenv, $input, (jbyte *)$1, 0);
 }
-%typemap(directorin, descriptor="[B") (char *STRING, size_t LENGTH) %{
-  jbyteArray $1_jb = (jenv)->NewByteArray((jsize)$2);
-  (jenv)->SetByteArrayRegion($1_jb, 0, (jsize)$2, (jbyte *)$1);
-  $input = $1_jb;
-  Swig::LocalRefGuard $1_refguard(jenv, $input);
-%}
+%typemap(directorin, descriptor="[B", noblock=1) (char *STRING, size_t LENGTH) {
+  $input = 0;
+  if ($1) {
+    $input = JCALL1(NewByteArray, jenv, (jsize)$2);
+    if (!$input) return $null;
+    JCALL4(SetByteArrayRegion, jenv, $input, 0, (jsize)$2, (jbyte *)$1);
+  }
+  Swig::LocalRefGuard $refguard(jenv, $input);
+}
 %typemap(directorargout) (char *STRING, size_t LENGTH)
 %{(jenv)->GetByteArrayRegion($input, 0, (jsize)$2, (jbyte *)$1);
 (jenv)->DeleteLocalRef($input);%}
diff --git a/Lib/java/typemaps.i b/Lib/java/typemaps.i
index db7dd06..846875f 100644
--- a/Lib/java/typemaps.i
+++ b/Lib/java/typemaps.i
@@ -216,18 +216,18 @@
   $input = JCALL1(New##JAVATYPE##Array, jenv, 1);
   Swig::LocalRefGuard $1_refguard(jenv, $input); %}
 
-%typemap(directorargout) TYPE &OUTPUT
+%typemap(directorargout, noblock=1) TYPE &OUTPUT
 {
-  JNITYPE jvalue;
-  JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue);
-  $result = jvalue;
+  JNITYPE $1_jvalue;
+  JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
+  $result = $1_jvalue;
 }
 
-%typemap(directorargout) TYPE *OUTPUT
+%typemap(directorargout, noblock=1) TYPE *OUTPUT
 {
-  JNITYPE jvalue;
-  JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue);
-  *$result = jvalue;
+  JNITYPE $1_jvalue;
+  JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
+  *$result = $1_jvalue;
 }
 
 %typemap(typecheck) TYPE *OUTPUT = TYPECHECKTYPE;
@@ -373,28 +373,26 @@
 
 %typemap(directorin,descriptor=JNIDESC) TYPE &INOUT %{
     $input = JCALL1(New##JAVATYPE##Array, jenv, 1);
-    const JNITYPE $1_jvalue = (JNITYPE)$1;
+    JNITYPE $1_jvalue = (JNITYPE)$1;
     JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
     Swig::LocalRefGuard $1_refguard(jenv, $input); %}
 
 %typemap(directorin,descriptor=JNIDESC) TYPE *INOUT %{
   $input = JCALL1(New##JAVATYPE##Array, jenv, 1);
-  const JNITYPE $1_jvalue = (JNITYPE)*$1;
+  JNITYPE $1_jvalue = (JNITYPE)*$1;
   JCALL4(Set##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
   Swig::LocalRefGuard $1_refguard(jenv, $input); %}
 
-%typemap(directorargout) TYPE &INOUT
+%typemap(directorargout, noblock=1) TYPE &INOUT
 {
-  JNITYPE jvalue;
-  JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue);
-  $result = jvalue;
+  JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
+  $result = $1_jvalue;
 }
 
-%typemap(directorargout) TYPE *INOUT
+%typemap(directorargout, noblock=1) TYPE *INOUT
 {
-  JNITYPE jvalue;
-  JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &jvalue);
-  *$result = jvalue;
+  JCALL4(Get##JAVATYPE##ArrayRegion, jenv, $input, 0, 1, &$1_jvalue);
+  *$result = $1_jvalue;
 }
 
 %typemap(typecheck) TYPE *INOUT = TYPECHECKTYPE;