// CallStaticObjectMethod calls a static Java method that returns a Java object. func CallStaticObjectMethod(env Env, class Class, name string, argSigns []Sign, retSign Sign, args ...interface{}) (Object, error) { switch retSign { case ByteSign, CharSign, ShortSign, LongSign, FloatSign, DoubleSign, BoolSign, IntSign, VoidSign: panic(fmt.Sprintf("Illegal call to CallStaticObjectMethod on method with return sign %s", retSign)) } jmid, jArgArr, freeFunc, err := setupStaticMethodCall(env, class, name, argSigns, retSign, args...) if err != nil { return NullObject, err } defer freeFunc() ret := C.CallStaticObjectMethodA(env.value(), class.value(), jmid, jArgArr) return Object(uintptr(unsafe.Pointer(ret))), JExceptionMsg(env) }
// GoError converts the provided Java Exception into a Go error, converting VException into // verror.T and all other exceptions into a Go error. func GoError(env Env, jException Object) error { if jException.IsNull() { return nil } if IsInstanceOf(env, jException, jVExceptionClass) { // VException: convert it into a verror. // Note that we can't use CallStaticObjectMethod below as it may lead to // an infinite loop. jmid, jArgArr, freeFunc, err := setupStaticMethodCall(env, jVomUtilClass, "encode", []Sign{ObjectSign, TypeSign}, ByteArraySign, jException, jVExceptionClass) if err != nil { return fmt.Errorf("error converting VException: " + err.Error()) } defer freeFunc() dataObj := C.CallStaticObjectMethodA(env.value(), jVomUtilClass.value(), jmid, jArgArr) if e := C.ExceptionOccurred(env.value()); e != nil { C.ExceptionClear(env.value()) return fmt.Errorf("error converting VException: exception during VomUtil.encode()") } data := GoByteArray(env, Object(uintptr(unsafe.Pointer(dataObj)))) var verr error if err := vom.Decode(data, &verr); err != nil { return fmt.Errorf("error converting VException: " + err.Error()) } return verr } // Not a VException: convert it into a Go error. // Note that we can't use CallObjectMethod below, as it may lead to an // infinite loop. jmid, jArgArr, freeFunc, err := setupMethodCall(env, jException, "getMessage", nil, StringSign) if err != nil { return fmt.Errorf("error converting exception: " + err.Error()) } defer freeFunc() strObj := C.CallObjectMethodA(env.value(), jException.value(), jmid, jArgArr) if e := C.ExceptionOccurred(env.value()); e != nil { C.ExceptionClear(env.value()) return fmt.Errorf("error converting exception: exception during Throwable.getMessage()") } return errors.New(GoString(env, Object(uintptr(unsafe.Pointer(strObj))))) }