func (d *dispatcher) Lookup(ctx *context.T, suffix string) (interface{}, security.Authorizer, error) { // Get Java environment. env, freeFunc := jutil.GetEnv() defer freeFunc() result, err := jutil.CallStaticLongArrayMethod(env, jServerRPCHelperClass, "lookup", []jutil.Sign{dispatcherSign, jutil.StringSign}, d.jDispatcher, suffix) if err != nil { return nil, nil, fmt.Errorf("error invoking Java dispatcher's lookup() method: %v", err) } if result == nil { // Lookup returned null, which means that the dispatcher isn't handling the object - // this is not an error. return nil, nil, nil } if len(result) != 2 { return nil, nil, fmt.Errorf("lookup returned %d elems, want 2", len(result)) } invoker := *(*rpc.Invoker)(jutil.GoRefValue(jutil.Ref(result[0]))) jutil.GoDecRef(jutil.Ref(result[0])) authorizer := security.Authorizer(nil) if result[1] != 0 { authorizer = *(*security.Authorizer)(jutil.GoRefValue(jutil.Ref(result[1]))) jutil.GoDecRef(jutil.Ref(result[1])) } return invoker, authorizer, nil }
//export Java_io_v_impl_google_lib_discovery_UpdateImpl_nativeAttachment func Java_io_v_impl_google_lib_discovery_UpdateImpl_nativeAttachment(jenv *C.JNIEnv, _ C.jobject, goRef C.jlong, jCtx C.jobject, jName C.jstring, jCbObj C.jobject) { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) ctx, _, err := jcontext.GoContext(env, jutil.Object(uintptr(unsafe.Pointer(jCtx)))) if err != nil { jutil.JThrowV(env, err) return } update := *(*discovery.Update)(jutil.GoRefValue(jutil.Ref(goRef))) name := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jName)))) jCb := jutil.Object(uintptr(unsafe.Pointer(jCbObj))) jutil.DoAsyncCall(env, jCb, func() (jutil.Object, error) { dataOrErr := <-update.Attachment(ctx, name) if dataOrErr.Error != nil { return jutil.NullObject, err } env, freeFunc := jutil.GetEnv() defer freeFunc() jData, err := jutil.JByteArray(env, dataOrErr.Data) if err != nil { return jutil.NullObject, err } // Must grab a global reference as we free up the env and all local references that come // along with it. return jutil.NewGlobalRef(env, jData), nil // Un-refed in DoAsyncCall }) }
//export Java_io_v_v23_security_BlessingPattern_nativeIsValid func Java_io_v_v23_security_BlessingPattern_nativeIsValid(jenv *C.JNIEnv, jBlessingPattern C.jobject, goRef C.jlong) C.jboolean { valid := (*(*security.BlessingPattern)(jutil.GoRefValue(jutil.Ref(goRef)))).IsValid() if valid { return C.JNI_TRUE } return C.JNI_FALSE }
//export Java_io_v_v23_security_VPrincipalImpl_nativeBless func Java_io_v_v23_security_VPrincipalImpl_nativeBless(jenv *C.JNIEnv, jVPrincipalImpl C.jobject, goRef C.jlong, jKey C.jobject, jWith C.jobject, jExtension C.jstring, jCaveat C.jobject, jAdditionalCaveats C.jobjectArray) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) key, err := GoPublicKey(env, jutil.Object(uintptr(unsafe.Pointer(jKey)))) if err != nil { jutil.JThrowV(env, err) return nil } with, err := GoBlessings(env, jutil.Object(uintptr(unsafe.Pointer(jWith)))) if err != nil { jutil.JThrowV(env, err) return nil } extension := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jExtension)))) caveat, err := GoCaveat(env, jutil.Object(uintptr(unsafe.Pointer(jCaveat)))) if err != nil { jutil.JThrowV(env, err) return nil } additionalCaveats, err := GoCaveats(env, jutil.Object(uintptr(unsafe.Pointer(jAdditionalCaveats)))) if err != nil { jutil.JThrowV(env, err) return nil } blessings, err := (*(*security.Principal)(jutil.GoRefValue(jutil.Ref(goRef)))).Bless(key, with, extension, caveat, additionalCaveats...) if err != nil { jutil.JThrowV(env, err) return nil } jBlessings, err := JavaBlessings(env, blessings) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jBlessings)) }
// GoBlessingStore creates an instance of security.BlessingStore that uses the // provided Java BlessingStore as its underlying implementation. func GoBlessingStore(env jutil.Env, jBlessingStore jutil.Object) (security.BlessingStore, error) { if jBlessingStore.IsNull() { return nil, nil } if jutil.IsInstanceOf(env, jBlessingStore, jBlessingStoreImplClass) { // Called with our implementation of BlessingStore, which maintains a Go reference - use it. ref, err := jutil.JLongField(env, jBlessingStore, "nativeRef") if err != nil { return nil, err } return (*(*security.BlessingStore)(jutil.GoRefValue(jutil.Ref(ref)))), nil } // Reference Java BlessingStore; it will be de-referenced when the Go // BlessingStore created below is garbage-collected (through the finalizer // callback we setup just below). jBlessingStore = jutil.NewGlobalRef(env, jBlessingStore) s := &blessingStore{ jBlessingStore: jBlessingStore, } runtime.SetFinalizer(s, func(s *blessingStore) { env, freeFunc := jutil.GetEnv() defer freeFunc() jutil.DeleteGlobalRef(env, s.jBlessingStore) }) return s, nil }
// GoAuthorizer converts the given Java authorizer into a Go authorizer. func GoAuthorizer(env jutil.Env, jAuth jutil.Object) (security.Authorizer, error) { if jAuth.IsNull() { return nil, nil } if jutil.IsInstanceOf(env, jAuth, jPermissionsAuthorizerClass) { // Called with our implementation of Authorizer, which maintains a Go reference - use it. ref, err := jutil.JLongField(env, jAuth, "nativeRef") if err != nil { return nil, err } return *(*security.Authorizer)(jutil.GoRefValue(jutil.Ref(ref))), nil } // Reference Java dispatcher; it will be de-referenced when the go // dispatcher created below is garbage-collected (through the finalizer // callback we setup below). jAuth = jutil.NewGlobalRef(env, jAuth) a := &authorizer{ jAuth: jAuth, } runtime.SetFinalizer(a, func(a *authorizer) { env, freeFunc := jutil.GetEnv() defer freeFunc() jutil.DeleteGlobalRef(env, a.jAuth) }) return a, nil }
// GoCall creates instance of security.Call that uses the provided Java // Call as its underlying implementation. func GoCall(env jutil.Env, jCall jutil.Object) (security.Call, error) { if jCall.IsNull() { return nil, nil } if jutil.IsInstanceOf(env, jCall, jCallImplClass) { // Called with our implementation of Call, which maintains a Go reference - use it. ref, err := jutil.CallLongMethod(env, jCall, "nativeRef", nil) if err != nil { return nil, err } return (*(*security.Call)(jutil.GoRefValue(jutil.Ref(ref)))), nil } // Reference Java call; it will be de-referenced when the go call // created below is garbage-collected (through the finalizer callback we // setup just below). jCall = jutil.NewGlobalRef(env, jCall) call := &callImpl{ jCall: jCall, } runtime.SetFinalizer(call, func(c *callImpl) { env, freeFunc := jutil.GetEnv() defer freeFunc() jutil.DeleteGlobalRef(env, c.jCall) }) return call, nil }
//export Java_io_v_v23_security_BlessingRootsImpl_nativeDump func Java_io_v_v23_security_BlessingRootsImpl_nativeDump(jenv *C.JNIEnv, jBlessingRootsImpl C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) dump := (*(*security.BlessingRoots)(jutil.GoRefValue(jutil.Ref(goRef)))).Dump() result := make(map[jutil.Object][]jutil.Object) for pattern, keys := range dump { jBlessingPattern, err := JavaBlessingPattern(env, pattern) if err != nil { jutil.JThrowV(env, err) return nil } jPublicKeys := make([]jutil.Object, len(keys)) for i, key := range keys { var err error if jPublicKeys[i], err = JavaPublicKey(env, key); err != nil { jutil.JThrowV(env, err) return nil } } result[jBlessingPattern] = jPublicKeys } jMap, err := jutil.JObjectMultimap(env, result) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jMap)) }
//export Java_io_v_impl_google_rpc_StreamImpl_nativeRecv func Java_io_v_impl_google_rpc_StreamImpl_nativeRecv(jenv *C.JNIEnv, jStream C.jobject, goRef C.jlong, jCallbackObj C.jobject) { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) jCallback := jutil.Object(uintptr(unsafe.Pointer(jCallbackObj))) result := new(vdl.Value) jutil.DoAsyncCall(env, jCallback, func() (jutil.Object, error) { if err := (*(*rpc.Stream)(jutil.GoRefValue(jutil.Ref(goRef)))).Recv(&result); err != nil { if err == io.EOF { // Java uses EndOfFile error to detect EOF. err = verror.NewErrEndOfFile(nil) } return jutil.NullObject, err } vomResult, err := vom.Encode(result) if err != nil { return jutil.NullObject, err } env, freeFunc := jutil.GetEnv() defer freeFunc() jResult, err := jutil.JByteArray(env, vomResult) if err != nil { return jutil.NullObject, err } // Must grab a global reference as we free up the env and all local references that come along // with it. return jutil.NewGlobalRef(env, jResult), nil // Un-refed in DoAsyncCall }) }
//export Java_io_v_impl_google_rpc_ClientCallImpl_nativeCloseSend func Java_io_v_impl_google_rpc_ClientCallImpl_nativeCloseSend(jenv *C.JNIEnv, jCall C.jobject, goRef C.jlong, jCallbackObj C.jobject) { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) jCallback := jutil.Object(uintptr(unsafe.Pointer(jCallbackObj))) jutil.DoAsyncCall(env, jCallback, func() (jutil.Object, error) { return jutil.NullObject, (*(*rpc.ClientCall)(jutil.GoRefValue(jutil.Ref(goRef)))).CloseSend() }) }
func doFinish(goRef C.jlong, numResults int) (jutil.Object, error) { // Have all the results be decoded into *vdl.Value. resultPtrs := make([]interface{}, numResults) for i := 0; i < numResults; i++ { value := new(vdl.Value) resultPtrs[i] = &value } if err := (*(*rpc.ClientCall)(jutil.GoRefValue(jutil.Ref(goRef)))).Finish(resultPtrs...); err != nil { // Invocation error. return jutil.NullObject, err } // VOM-encode the results. vomResults := make([][]byte, numResults) for i, resultPtr := range resultPtrs { // Remove the pointer from the result. Simply *resultPtr doesn't work // as resultPtr is of type interface{}. result := interface{}(jutil.DerefOrDie(resultPtr)) var err error if vomResults[i], err = vom.Encode(result); err != nil { return jutil.NullObject, err } } env, freeFunc := jutil.GetEnv() defer freeFunc() jArr, err := jutil.JByteArrayArray(env, vomResults) if err != nil { return jutil.NullObject, err } // Must grab a global reference as we free up the env and all local references that come along // with it. return jutil.NewGlobalRef(env, jArr), nil // Un-refed in DoAsyncCall }
// GoPrincipal converts the provided Java VPrincipal object into a Go Principal. func GoPrincipal(env jutil.Env, jPrincipal jutil.Object) (security.Principal, error) { if jPrincipal.IsNull() { return nil, nil } if jutil.IsInstanceOf(env, jPrincipal, jVPrincipalImplClass) { // Called with our implementation of VPrincipal, which maintains a Go reference - use it. ref, err := jutil.CallLongMethod(env, jPrincipal, "nativeRef", nil) if err != nil { return nil, err } return (*(*security.Principal)(jutil.GoRefValue(jutil.Ref(ref)))), nil } // Reference Java VPrincipal; it will be de-referenced when the Go Principal // created below is garbage-collected (through the finalizer callback we // setup just below). jPrincipal = jutil.NewGlobalRef(env, jPrincipal) // Create Go Principal. p := &principal{ jPrincipal: jPrincipal, } runtime.SetFinalizer(p, func(p *principal) { env, freeFunc := jutil.GetEnv() defer freeFunc() jutil.DeleteGlobalRef(env, p.jPrincipal) }) return p, nil }
// GoBlessingRoots creates an instance of security.BlessingRoots that uses the // provided Java BlessingRoots as its underlying implementation. func GoBlessingRoots(env jutil.Env, jBlessingRoots jutil.Object) (security.BlessingRoots, error) { if jBlessingRoots.IsNull() { return nil, nil } if jutil.IsInstanceOf(env, jBlessingRoots, jBlessingRootsImplClass) { // Called with our implementation of BlessingRoots, which maintains a Go reference - use it. ref, err := jutil.CallLongMethod(env, jBlessingRoots, "nativeRef", nil) if err != nil { return nil, err } return (*(*security.BlessingRoots)(jutil.GoRefValue(jutil.Ref(ref)))), nil } // Reference Java BlessingRoots; it will be de-referenced when the Go // BlessingRoots created below is garbage-collected (through the finalizer // callback we setup just below). jBlessingRoots = jutil.NewGlobalRef(env, jBlessingRoots) r := &blessingRoots{ jBlessingRoots: jBlessingRoots, } runtime.SetFinalizer(r, func(r *blessingRoots) { env, freeFunc := jutil.GetEnv() defer freeFunc() jutil.DeleteGlobalRef(env, r.jBlessingRoots) }) return r, nil }
//export Java_io_v_impl_google_channel_OutputChannelImpl_nativeSend func Java_io_v_impl_google_channel_OutputChannelImpl_nativeSend(jenv *C.JNIEnv, jOutputChannelClass C.jclass, goConvertRef C.jlong, goSendRef C.jlong, jItemObj C.jobject, jCallbackObj C.jobject) { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) convert := *(*func(jutil.Object) (interface{}, error))(jutil.GoRefValue(jutil.Ref(goConvertRef))) send := *(*func(interface{}) error)(jutil.GoRefValue(jutil.Ref(goSendRef))) jItem := jutil.Object(uintptr(unsafe.Pointer(jItemObj))) jCallback := jutil.Object(uintptr(unsafe.Pointer(jCallbackObj))) // NOTE(spetrovic): Conversion must be done outside of DoAsyncCall as it references a Java // object. item, err := convert(jItem) if err != nil { jutil.CallbackOnFailure(env, jCallback, err) return } jutil.DoAsyncCall(env, jCallback, func() (jutil.Object, error) { return jutil.NullObject, send(item) }) }
//export Java_io_v_impl_google_rpc_ServerImpl_nativeAddName func Java_io_v_impl_google_rpc_ServerImpl_nativeAddName(jenv *C.JNIEnv, jServer C.jobject, goRef C.jlong, jName C.jstring) { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) name := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jName)))) if err := (*(*rpc.Server)(jutil.GoRefValue(jutil.Ref(goRef)))).AddName(name); err != nil { jutil.JThrowV(env, err) return } }
//export Java_io_v_impl_google_channel_OutputChannelImpl_nativeClose func Java_io_v_impl_google_channel_OutputChannelImpl_nativeClose(jenv *C.JNIEnv, jOutputChannelClass C.jclass, goCloseRef C.jlong, jCallbackObj C.jobject) { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) close := *(*func() error)(jutil.GoRefValue(jutil.Ref(goCloseRef))) jCallback := jutil.Object(uintptr(unsafe.Pointer(jCallbackObj))) jutil.DoAsyncCall(env, jCallback, func() (jutil.Object, error) { return jutil.NullObject, close() }) }
//export Java_io_v_impl_google_rpc_ServerCallImpl_nativeRemoteEndpoint func Java_io_v_impl_google_rpc_ServerCallImpl_nativeRemoteEndpoint(jenv *C.JNIEnv, jServerCall C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) jEndpoint, err := jnaming.JavaEndpoint(env, (*(*rpc.ServerCall)(jutil.GoRefValue(jutil.Ref(goRef)))).RemoteEndpoint()) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jEndpoint)) }
//export Java_io_v_v23_security_CallImpl_nativeRemoteBlessings func Java_io_v_v23_security_CallImpl_nativeRemoteBlessings(jenv *C.JNIEnv, jCall C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) blessings := (*(*security.Call)(jutil.GoRefValue(jutil.Ref(goRef)))).RemoteBlessings() jBlessings, err := JavaBlessings(env, blessings) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jBlessings)) }
//export Java_io_v_impl_google_rpc_ServerCallImpl_nativeServer func Java_io_v_impl_google_rpc_ServerCallImpl_nativeServer(jenv *C.JNIEnv, jServerCall C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) server := (*(*rpc.ServerCall)(jutil.GoRefValue(jutil.Ref(goRef)))).Server() jServer, err := JavaServer(env, server) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jServer)) }
//export Java_io_v_impl_google_rpc_ServerCallImpl_nativeGrantedBlessings func Java_io_v_impl_google_rpc_ServerCallImpl_nativeGrantedBlessings(jenv *C.JNIEnv, jServerCall C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) blessings := (*(*rpc.ServerCall)(jutil.GoRefValue(jutil.Ref(goRef)))).GrantedBlessings() jBlessings, err := jsecurity.JavaBlessings(env, blessings) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jBlessings)) }
//export Java_io_v_v23_security_VPrincipalImpl_nativeBlessingStore func Java_io_v_v23_security_VPrincipalImpl_nativeBlessingStore(jenv *C.JNIEnv, jVPrincipalImpl C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) store := (*(*security.Principal)(jutil.GoRefValue(jutil.Ref(goRef)))).BlessingStore() jStore, err := JavaBlessingStore(env, store) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jStore)) }
//export Java_io_v_v23_security_VPrincipalImpl_nativeRoots func Java_io_v_v23_security_VPrincipalImpl_nativeRoots(jenv *C.JNIEnv, jVPrincipalImpl C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) roots := (*(*security.Principal)(jutil.GoRefValue(jutil.Ref(goRef)))).Roots() jRoots, err := JavaBlessingRoots(env, roots) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jRoots)) }
//export Java_io_v_v23_security_Blessings_nativeSigningBlessings func Java_io_v_v23_security_Blessings_nativeSigningBlessings(jenv *C.JNIEnv, jBlessings C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) blessings := security.SigningBlessings(*(*security.Blessings)(jutil.GoRefValue(jutil.Ref(goRef)))) jSigningBlessings, err := JavaBlessings(env, blessings) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jSigningBlessings)) }
//export Java_io_v_impl_google_rpc_ServerImpl_nativeGetStatus func Java_io_v_impl_google_rpc_ServerImpl_nativeGetStatus(jenv *C.JNIEnv, jServer C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) status := (*(*rpc.Server)(jutil.GoRefValue(jutil.Ref(goRef)))).Status() jStatus, err := JavaServerStatus(env, status) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jStatus)) }
//export Java_io_v_v23_security_Blessings_nativeWireFormat func Java_io_v_v23_security_Blessings_nativeWireFormat(jenv *C.JNIEnv, jBlessings C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) wire := security.MarshalBlessings(*(*security.Blessings)(jutil.GoRefValue(jutil.Ref(goRef)))) jWire, err := JavaWireBlessings(env, wire) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jWire)) }
//export Java_io_v_v23_security_BlessingStoreImpl_nativeDefaultBlessings func Java_io_v_v23_security_BlessingStoreImpl_nativeDefaultBlessings(jenv *C.JNIEnv, jBlessingStoreImpl C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) blessings, _ := (*(*security.BlessingStore)(jutil.GoRefValue(jutil.Ref(goRef)))).Default() jBlessings, err := JavaBlessings(env, blessings) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jBlessings)) }
//export Java_io_v_v23_security_BlessingStoreImpl_nativePublicKey func Java_io_v_v23_security_BlessingStoreImpl_nativePublicKey(jenv *C.JNIEnv, jBlessingStoreImpl C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) key := (*(*security.BlessingStore)(jutil.GoRefValue(jutil.Ref(goRef)))).PublicKey() jKey, err := JavaPublicKey(env, key) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jKey)) }
//export Java_io_v_v23_security_BlessingPattern_nativeMakeNonExtendable func Java_io_v_v23_security_BlessingPattern_nativeMakeNonExtendable(jenv *C.JNIEnv, jBlessingPattern C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) pattern := (*(*security.BlessingPattern)(jutil.GoRefValue(jutil.Ref(goRef)))).MakeNonExtendable() jPattern, err := JavaBlessingPattern(env, pattern) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jPattern)) }
//export Java_io_v_v23_security_CallImpl_nativeLocalPrincipal func Java_io_v_v23_security_CallImpl_nativeLocalPrincipal(jenv *C.JNIEnv, jCall C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) principal := (*(*security.Call)(jutil.GoRefValue(jutil.Ref(goRef)))).LocalPrincipal() jPrincipal, err := JavaPrincipal(env, principal) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jPrincipal)) }
//export Java_io_v_v23_context_VContext_nativeWithCancel func Java_io_v_v23_context_VContext_nativeWithCancel(jenv *C.JNIEnv, jVContext C.jobject, goRef C.jlong) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) ctx, cancelFunc := context.WithCancel((*context.T)(jutil.GoRefValue(jutil.Ref(goRef)))) jCtx, err := JavaContext(env, ctx, cancelFunc) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jCtx)) }