| 1432 | } |
| 1433 | |
| 1434 | func (g *JavaGen) GenC() error { |
| 1435 | var pkgName, pkgPath string |
| 1436 | if g.Pkg != nil { |
| 1437 | pkgName = g.Pkg.Name() |
| 1438 | pkgPath = g.Pkg.Path() |
| 1439 | } else { |
| 1440 | pkgName = "universe" |
| 1441 | } |
| 1442 | g.Printf(cPreamble, g.gobindOpts(), pkgPath) |
| 1443 | g.Printf("#include %q\n", pkgName+".h") |
| 1444 | if g.Pkg != nil { |
| 1445 | for _, pkg := range g.Pkg.Imports() { |
| 1446 | if g.validPkg(pkg) { |
| 1447 | g.Printf("#include \"%s.h\"\n", pkg.Name()) |
| 1448 | } |
| 1449 | } |
| 1450 | } |
| 1451 | g.Printf("\n") |
| 1452 | |
| 1453 | for _, iface := range g.interfaces { |
| 1454 | g.Printf("jclass proxy_class_%s_%s;\n", g.pkgPrefix, iface.obj.Name()) |
| 1455 | g.Printf("jmethodID proxy_class_%s_%s_cons;\n", g.pkgPrefix, iface.obj.Name()) |
| 1456 | for _, m := range iface.summary.callable { |
| 1457 | if !g.isSigSupported(m.Type()) { |
| 1458 | g.Printf("// skipped method %s.%s with unsupported parameter or return types\n\n", iface.obj.Name(), m.Name()) |
| 1459 | continue |
| 1460 | } |
| 1461 | g.Printf("static jmethodID mid_%s_%s;\n", iface.obj.Name(), m.Name()) |
| 1462 | } |
| 1463 | } |
| 1464 | for _, s := range g.structs { |
| 1465 | g.Printf("jclass proxy_class_%s_%s;\n", g.pkgPrefix, s.obj.Name()) |
| 1466 | g.Printf("jmethodID proxy_class_%s_%s_cons;\n", g.pkgPrefix, s.obj.Name()) |
| 1467 | } |
| 1468 | g.Printf("\n") |
| 1469 | g.Printf("JNIEXPORT void JNICALL\n") |
| 1470 | g.Printf("Java_%s_%s__1init(JNIEnv *env, jclass _unused) {\n", g.jniPkgName(), java.JNIMangle(g.className())) |
| 1471 | g.Indent() |
| 1472 | g.Printf("jclass clazz;\n") |
| 1473 | for _, s := range g.structs { |
| 1474 | if jinf, ok := g.jstructs[s.obj]; ok { |
| 1475 | // Leave the class and constructor NULL for Java classes with no |
| 1476 | // default constructor. |
| 1477 | if !jinf.genNoargCon { |
| 1478 | continue |
| 1479 | } |
| 1480 | } |
| 1481 | g.Printf("clazz = (*env)->FindClass(env, %q);\n", g.jniClassSigPrefix(s.obj.Pkg())+g.javaTypeName(s.obj.Name())) |
| 1482 | g.Printf("proxy_class_%s_%s = (*env)->NewGlobalRef(env, clazz);\n", g.pkgPrefix, s.obj.Name()) |
| 1483 | g.Printf("proxy_class_%s_%s_cons = (*env)->GetMethodID(env, clazz, \"<init>\", \"(I)V\");\n", g.pkgPrefix, s.obj.Name()) |
| 1484 | } |
| 1485 | for _, iface := range g.interfaces { |
| 1486 | pkg := iface.obj.Pkg() |
| 1487 | g.Printf("clazz = (*env)->FindClass(env, %q);\n", g.jniClassSigPrefix(pkg)+JavaClassName(pkg)+"$proxy"+iface.obj.Name()) |
| 1488 | g.Printf("proxy_class_%s_%s = (*env)->NewGlobalRef(env, clazz);\n", g.pkgPrefix, iface.obj.Name()) |
| 1489 | g.Printf("proxy_class_%s_%s_cons = (*env)->GetMethodID(env, clazz, \"<init>\", \"(I)V\");\n", g.pkgPrefix, iface.obj.Name()) |
| 1490 | if isErrorType(iface.obj.Type()) { |
| 1491 | // As a special case, Java Exceptions are passed to Go pretending to implement the Go error interface. |