TBR v.io/x/jni: support for async globber api

MultiPart: 2/2
Change-Id: Ic8f8c5ff520a030857d2427378287b3f93e3b2f4
diff --git a/impl/google/rpc/invoker.go b/impl/google/rpc/invoker.go
index 20beb5b..5b9400e 100644
--- a/impl/google/rpc/invoker.go
+++ b/impl/google/rpc/invoker.go
@@ -200,13 +200,16 @@
 func (j javaGlobber) Glob__(ctx *context.T, call rpc.GlobServerCall, g *glob.Glob) error {
 	// TODO(sjr,rthellend): Update the Java API to match the new GO API.
 	env, freeFunc := jutil.GetEnv()
-	defer freeFunc()
-
-	jServerCall, err := JavaServerCall(env, call)
+	jContext, err := jcontext.JavaContext(env, ctx, nil)
 	if err != nil {
+		freeFunc()
 		return err
 	}
-
+	jServerCall, err := JavaServerCall(env, call)
+	if err != nil {
+		freeFunc()
+		return err
+	}
 	convert := func(input jutil.Object) (interface{}, error) {
 		env, freeFunc := jutil.GetEnv()
 		defer freeFunc()
@@ -228,17 +231,11 @@
 	}
 	jOutputChannel, err := jchannel.JavaOutputChannel(env, ctx, nil, convert, send, close)
 	if err != nil {
+		freeFunc()
 		return err
 	}
-
-	callSign := jutil.ClassSign("io.v.v23.rpc.ServerCall")
 	channelSign := jutil.ClassSign("io.v.v23.OutputChannel")
-
-	jServerCall = jutil.NewGlobalRef(env, jServerCall)
-	jOutputChannel = jutil.NewGlobalRef(env, jOutputChannel)
-	// Calls Java invoker's glob method.
-	jutil.CallVoidMethod(env, j.i.jInvoker, "glob", []jutil.Sign{callSign, jutil.StringSign, channelSign}, jServerCall, g.String(), jOutputChannel)
-	jutil.DeleteGlobalRef(env, jServerCall)
-	jutil.DeleteGlobalRef(env, jOutputChannel)
-	return nil
+	// This method will invoke the freeFunc().
+	_, err = jutil.CallStaticFutureMethod(env, freeFunc, jServerRPCHelperClass, "glob", []jutil.Sign{invokerSign, contextSign, serverCallSign, jutil.StringSign, channelSign}, j.i.jInvoker, jContext, jServerCall, g.String(), jOutputChannel)
+	return err
 }