(f *types.Func, sName string)
| 1118 | } |
| 1119 | |
| 1120 | func (g *JavaGen) genJNIConstructor(f *types.Func, sName string) { |
| 1121 | if !g.isConsSigSupported(f.Type()) { |
| 1122 | return |
| 1123 | } |
| 1124 | sig := f.Type().(*types.Signature) |
| 1125 | res := sig.Results() |
| 1126 | |
| 1127 | g.Printf("JNIEXPORT jint JNICALL\n") |
| 1128 | g.Printf("Java_%s_%s_%s(JNIEnv *env, jclass clazz", g.jniPkgName(), java.JNIMangle(g.javaTypeName(sName)), java.JNIMangle("__"+f.Name())) |
| 1129 | params := sig.Params() |
| 1130 | for i := 0; i < params.Len(); i++ { |
| 1131 | v := params.At(i) |
| 1132 | jt := g.jniType(v.Type()) |
| 1133 | g.Printf(", %s %s", jt, g.paramName(params, i)) |
| 1134 | } |
| 1135 | g.Printf(") {\n") |
| 1136 | g.Indent() |
| 1137 | for i := 0; i < params.Len(); i++ { |
| 1138 | name := g.paramName(params, i) |
| 1139 | g.genJavaToC(name, params.At(i).Type(), modeTransient) |
| 1140 | } |
| 1141 | // Constructors always return a mandatory *T and an optional error |
| 1142 | if res.Len() == 1 { |
| 1143 | g.Printf("int32_t refnum = proxy%s__%s(", g.pkgPrefix, f.Name()) |
| 1144 | } else { |
| 1145 | g.Printf("struct proxy%s__%s_return res = proxy%s__%s(", g.pkgPrefix, f.Name(), g.pkgPrefix, f.Name()) |
| 1146 | } |
| 1147 | for i := 0; i < params.Len(); i++ { |
| 1148 | if i > 0 { |
| 1149 | g.Printf(", ") |
| 1150 | } |
| 1151 | g.Printf("_%s", g.paramName(params, i)) |
| 1152 | } |
| 1153 | g.Printf(");\n") |
| 1154 | for i := 0; i < params.Len(); i++ { |
| 1155 | g.genRelease(g.paramName(params, i), params.At(i).Type(), modeTransient) |
| 1156 | } |
| 1157 | // Extract multi returns and handle errors |
| 1158 | if res.Len() == 2 { |
| 1159 | g.Printf("int32_t refnum = res.r0;\n") |
| 1160 | g.genCToJava("_err", "res.r1", res.At(1).Type(), modeRetained) |
| 1161 | g.Printf("go_seq_maybe_throw_exception(env, _err);\n") |
| 1162 | } |
| 1163 | g.Printf("return refnum;\n") |
| 1164 | g.Outdent() |
| 1165 | g.Printf("}\n\n") |
| 1166 | } |
| 1167 | |
| 1168 | func (g *JavaGen) genJNIFunc(o *types.Func, sName string, jm *java.Func, proxy, isjava bool) { |
| 1169 | if !g.isSigSupported(o.Type()) { |
no test coverage detected