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
}