bind/java: do not return null String for empty Go string

Fixes golang/go#13430

Change-Id: Ic018761af6a40f6b04ec4449110f54af8f543a53
Reviewed-on: https://go-review.googlesource.com/17273
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/bind/genjava.go b/bind/genjava.go
index a373854..4ffccf2 100644
--- a/bind/genjava.go
+++ b/bind/genjava.go
@@ -530,7 +530,7 @@
 	}
 	if returnsError {
 		g.Printf(`String _err = _out.readString();
-if (_err != null) {
+if (_err != null && !_err.isEmpty()) {
     throw new Exception(_err);
 }
 `)
diff --git a/bind/java/SeqTest.java b/bind/java/SeqTest.java
index a797543..b4f0f7a 100644
--- a/bind/java/SeqTest.java
+++ b/bind/java/SeqTest.java
@@ -81,6 +81,13 @@
     String want = "a short string";
     String got = Testpkg.StrDup(want);
     assertEquals("Strings should match", want, got);
+
+    want = "";
+    got = Testpkg.StrDup(want);
+    assertEquals("Strings should match (empty string)", want, got);
+
+    got = Testpkg.StrDup(null);
+    assertEquals("Strings should match (null string)", want, got);
   }
 
   public void testLongString() {
diff --git a/bind/java/seq_android.c b/bind/java/seq_android.c
index dfb2988..52f7901 100644
--- a/bind/java/seq_android.c
+++ b/bind/java/seq_android.c
@@ -282,7 +282,7 @@
 Java_go_Seq_readUTF16(JNIEnv *env, jobject obj) {
 	int32_t size = *MEM_READ(obj, int32_t);
 	if (size == 0) {
-		return NULL;
+		return (*env)->NewString(env, NULL, 0);
 	}
 	return (*env)->NewString(env, (jchar*)mem_read(env, obj, 2*size, 1), size);
 }
diff --git a/bind/testdata/basictypes.java.golden b/bind/testdata/basictypes.java.golden
index 98aed25..d0ad787 100644
--- a/bind/testdata/basictypes.java.golden
+++ b/bind/testdata/basictypes.java.golden
@@ -40,7 +40,7 @@
         go.Seq _out = new go.Seq();
         Seq.send(DESCRIPTOR, CALL_Error, _in, _out);
         String _err = _out.readString();
-        if (_err != null) {
+        if (_err != null && !_err.isEmpty()) {
             throw new Exception(_err);
         }
     }
@@ -52,7 +52,7 @@
         Seq.send(DESCRIPTOR, CALL_ErrorPair, _in, _out);
         _result = _out.readInt();
         String _err = _out.readString();
-        if (_err != null) {
+        if (_err != null && !_err.isEmpty()) {
             throw new Exception(_err);
         }
         return _result;
diff --git a/bind/testdata/interfaces.java.golden b/bind/testdata/interfaces.java.golden
index 7fd2425..25b0a36 100644
--- a/bind/testdata/interfaces.java.golden
+++ b/bind/testdata/interfaces.java.golden
@@ -25,7 +25,7 @@
         _in.writeRef(e.ref());
         Seq.send(DESCRIPTOR, CALL_CallErr, _in, _out);
         String _err = _out.readString();
-        if (_err != null) {
+        if (_err != null && !_err.isEmpty()) {
             throw new Exception(_err);
         }
     }
@@ -79,7 +79,7 @@
                 _in.writeRef(ref);
                 Seq.send(DESCRIPTOR, CALL_Err, _in, _out);
                 String _err = _out.readString();
-                if (_err != null) {
+                if (_err != null && !_err.isEmpty()) {
                     throw new Exception(_err);
                 }
             }
diff --git a/bind/testdata/issue12403.java.golden b/bind/testdata/issue12403.java.golden
index e98508e..a925bac 100644
--- a/bind/testdata/issue12403.java.golden
+++ b/bind/testdata/issue12403.java.golden
@@ -83,7 +83,7 @@
                 Seq.send(DESCRIPTOR, CALL_ToJSON, _in, _out);
                 _result = _out.readString();
                 String _err = _out.readString();
-                if (_err != null) {
+                if (_err != null && !_err.isEmpty()) {
                     throw new Exception(_err);
                 }
                 return _result;
diff --git a/bind/testdata/structs.java.golden b/bind/testdata/structs.java.golden
index 62b5e9c..332c03e 100644
--- a/bind/testdata/structs.java.golden
+++ b/bind/testdata/structs.java.golden
@@ -27,7 +27,7 @@
         Seq.send(DESCRIPTOR, CALL_IdentityWithError, _in, _out);
         _result = new S(_out.readRef());
         String _err = _out.readString();
-        if (_err != null) {
+        if (_err != null && !_err.isEmpty()) {
             throw new Exception(_err);
         }
         return _result;
@@ -92,7 +92,7 @@
             Seq.send(DESCRIPTOR, CALL_Identity, _in, _out);
             _result = new S(_out.readRef());
             String _err = _out.readString();
-            if (_err != null) {
+            if (_err != null && !_err.isEmpty()) {
                 throw new Exception(_err);
             }
             return _result;