// JFindClass returns the global reference to the Java class with the // given pathname, or an error if the class cannot be found. func JFindClass(env Env, name string) (Class, error) { cName := C.CString(name) defer C.free(unsafe.Pointer(cName)) class := C.FindClass(env.value(), cName) if err := JExceptionMsg(env); err != nil || class == nil { return NullClass, fmt.Errorf("couldn't find class %s: %v", name, err) } obj := NewGlobalRef(env, Object(uintptr(unsafe.Pointer(class)))) return Class(uintptr(unsafe.Pointer(C.jclass(obj.value())))), nil }
// returns a Class object; the object will first be looked up in cache, // and if not found there, resolved via Java and stored in the cache path. // classes returned via /THIS/ channel, need not be unrefed, as they all // hold a global ref. // // TODO: in truth, they should probably ALL be local-refs of the cached one... func (self *Environment) GetClass(klass types.Name) (c *Class, err error) { c, err = self.findCachedClass(klass) if err == nil { return } s := C.CString(klass.AsPath()) defer C.free(unsafe.Pointer(s)) // print("envFindClass ", klass,"\n") kl := C.envFindClass(self.env, s) if kl == nil { //print("GetClass missed ", klass.AsPath(), "\n\n") err = self.ExceptionOccurred() } else { err = nil // clear the cache error //print("found ", klass,"\n") kl = C.jclass(C.envNewGlobalRef(self.env, kl)) c = newClass(kl) self.classes[klass.AsPath()] = c } return }
// Syntactic sugar around &Class{C.jclass(LocalRef(&Object{C.jobject(class.class)}))} func (self *Environment) NewLocalClassRef(c *Class) *Class { return newClass(C.jclass(C.envNewLocalRef(self.env, c.class))) }
func (c Class) value() C.jclass { return C.jclass(unsafe.Pointer(c)) }