func genPkg(p *types.Package, allPkg []*types.Package, classes []*java.Class) { fname := defaultFileName(*lang, p) conf := &bind.GeneratorConfig{ Fset: fset, Pkg: p, AllPkg: allPkg, } switch *lang { case "java": var buf bytes.Buffer g := &bind.JavaGen{ JavaPkg: *javaPkg, Generator: &bind.Generator{ Printer: &bind.Printer{Buf: &buf, IndentEach: []byte(" ")}, Fset: conf.Fset, AllPkg: conf.AllPkg, Pkg: conf.Pkg, }, } g.Init(classes) pkgname := bind.JavaPkgName(*javaPkg, p) pkgDir := strings.Replace(pkgname, ".", "/", -1) buf.Reset() w, closer := writer(filepath.Join(pkgDir, fname)) processErr(g.GenJava()) io.Copy(w, &buf) closer() for i, name := range g.ClassNames() { buf.Reset() w, closer := writer(filepath.Join(pkgDir, name+".java")) processErr(g.GenClass(i)) io.Copy(w, &buf) closer() } buf.Reset() pn := "universe" if p != nil { pn = p.Name() } cname := "java_" + pn + ".c" w, closer = writer(cname) processErr(g.GenC()) io.Copy(w, &buf) closer() buf.Reset() hname := pn + ".h" w, closer = writer(hname) processErr(g.GenH()) io.Copy(w, &buf) closer() // Generate support files along with the universe package if p == nil { p, err := build.Default.Import("golang.org/x/mobile/bind", ".", build.ImportComment) if err != nil { errorf(`"golang.org/x/mobile/bind" is not found; run go get golang.org/x/mobile/bind: %v`) return } repo := filepath.Clean(filepath.Join(p.Dir, "..")) // golang.org/x/mobile directory. for _, javaFile := range []string{"Seq.java", "LoadJNI.java"} { src := filepath.Join(repo, "bind/java/"+javaFile) in, err := os.Open(src) if err != nil { errorf("failed to open Java support file: %v", err) } defer in.Close() w, closer := writer(filepath.Join("go", javaFile)) defer closer() if _, err := io.Copy(w, in); err != nil { errorf("failed to copy Java support file: %v", err) return } } } case "go": w, closer := writer(fname) conf.Writer = w processErr(bind.GenGo(conf)) closer() case "objc": var gohname string if p != nil { gohname = p.Name() + ".h" } else { gohname = "GoUniverse.h" } var buf bytes.Buffer g := &bind.ObjcGen{ Generator: &bind.Generator{ Printer: &bind.Printer{Buf: &buf, IndentEach: []byte("\t")}, Fset: conf.Fset, AllPkg: conf.AllPkg, Pkg: conf.Pkg, }, Prefix: *prefix, } g.Init(nil) w, closer := writer(gohname) processErr(g.GenGoH()) io.Copy(w, &buf) closer() hname := fname[:len(fname)-2] + ".h" w, closer = writer(hname) processErr(g.GenH()) io.Copy(w, &buf) closer() w, closer = writer(fname) conf.Writer = w processErr(g.GenM()) io.Copy(w, &buf) closer() default: errorf("unknown target language: %q", *lang) } }
func (b *binder) GenJava(pkg *types.Package, allPkg []*types.Package, classes []*java.Class, outdir, androidDir string) error { jpkgname := bind.JavaPkgName(bindJavaPkg, pkg) javadir := filepath.Join(androidDir, strings.Replace(jpkgname, ".", "/", -1)) var className string pkgName := "" pkgPath := "" javaPkg := "" if pkg != nil { className = strings.Title(pkg.Name()) pkgName = pkg.Name() pkgPath = pkg.Path() javaPkg = bindJavaPkg } else { pkgName = "universe" className = "Universe" } javaFile := filepath.Join(javadir, className+".java") cFile := filepath.Join(outdir, "java_"+pkgName+".c") hFile := filepath.Join(outdir, pkgName+".h") bindOption := "-lang=java" if javaPkg != "" { bindOption += " -javapkg=" + javaPkg } var buf bytes.Buffer g := &bind.JavaGen{ JavaPkg: javaPkg, Generator: &bind.Generator{ Printer: &bind.Printer{Buf: &buf, IndentEach: []byte(" ")}, Fset: b.fset, AllPkg: allPkg, Pkg: pkg, }, } g.Init(classes) generate := func(w io.Writer) error { if buildX { printcmd("gobind %s -outdir=%s %s", bindOption, javadir, pkgPath) } if buildN { return nil } buf.Reset() if err := g.GenJava(); err != nil { return err } _, err := io.Copy(w, &buf) return err } if err := writeFile(javaFile, generate); err != nil { return err } for i, name := range g.ClassNames() { generate := func(w io.Writer) error { if buildN { return nil } buf.Reset() if err := g.GenClass(i); err != nil { return err } _, err := io.Copy(w, &buf) return err } classFile := filepath.Join(javadir, name+".java") if err := writeFile(classFile, generate); err != nil { return err } } generate = func(w io.Writer) error { if buildN { return nil } buf.Reset() if err := g.GenC(); err != nil { return err } _, err := io.Copy(w, &buf) return err } if err := writeFile(cFile, generate); err != nil { return err } generate = func(w io.Writer) error { if buildN { return nil } buf.Reset() if err := g.GenH(); err != nil { return err } _, err := io.Copy(w, &buf) return err } return writeFile(hFile, generate) }