//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_namespace_NamespaceImpl_nativeGlob func Java_io_v_impl_google_namespace_NamespaceImpl_nativeGlob(jenv *C.JNIEnv, jNamespaceClass C.jclass, goRef C.jlong, jContext C.jobject, jPattern C.jstring, jOptions C.jobject) C.jobject { env := jutil.Env(uintptr(unsafe.Pointer(jenv))) n := *(*namespace.T)(jutil.GoRefValue(jutil.Ref(goRef))) ctx, cancel, pattern, opts, err := globArgs(env, jContext, jPattern, jOptions) if err != nil { jutil.JThrowV(env, err) return nil } var globChannel <-chan naming.GlobReply var globError error globDone := make(chan bool) go func() { globChannel, globError = n.Glob(ctx, pattern, opts...) close(globDone) }() jChannel, err := jchannel.JavaInputChannel(env, ctx, cancel, func() (jutil.Object, error) { // A few blocking calls below - don't call GetEnv() before they complete. <-globDone if globError != nil { return jutil.NullObject, globError } globReply, ok := <-globChannel if !ok { return jutil.NullObject, verror.NewErrEndOfFile(ctx) } env, freeFunc := jutil.GetEnv() defer freeFunc() jReply, err := jutil.JVomCopy(env, globReply, jGlobReplyClass) 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, jReply), nil // Un-refed by InputChannelImpl_nativeRecv }) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jChannel)) }
//export Java_io_v_impl_google_lib_discovery_DiscoveryImpl_nativeScan func Java_io_v_impl_google_lib_discovery_DiscoveryImpl_nativeScan(jenv *C.JNIEnv, _ C.jobject, goRef C.jlong, jCtx C.jobject, jQuery C.jstring) 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 nil } d := *(*discovery.T)(jutil.GoRefValue(jutil.Ref(goRef))) query := jutil.GoString(env, jutil.Object(uintptr(unsafe.Pointer(jQuery)))) scanCh, err := d.Scan(ctx, query) if err != nil { jutil.JThrowV(env, err) return nil } jChannel, err := jchannel.JavaInputChannel(env, ctx, nil, func() (jutil.Object, error) { update, ok := <-scanCh if !ok { return jutil.NullObject, verror.NewErrEndOfFile(ctx) } env, freeFunc := jutil.GetEnv() defer freeFunc() jUpdate, err := javaUpdate(env, update) 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, jUpdate), nil // un-refed by InputChannelImpl_nativeRecv }) if err != nil { jutil.JThrowV(env, err) return nil } return C.jobject(unsafe.Pointer(jChannel)) }