57 public String getIncludes() { |
57 public String getIncludes() { |
58 return "#include <jni.h>"; |
58 return "#include <jni.h>"; |
59 } |
59 } |
60 |
60 |
61 public void write(OutputStream o, TypeElement clazz) throws Util.Exit { |
61 public void write(OutputStream o, TypeElement clazz) throws Util.Exit { |
62 String cname = mangler.mangle(clazz.getQualifiedName(), Mangle.Type.CLASS); |
62 try { |
63 PrintWriter pw = wrapWriter(o); |
63 String cname = mangler.mangle(clazz.getQualifiedName(), Mangle.Type.CLASS); |
64 pw.println(guardBegin(cname)); |
64 PrintWriter pw = wrapWriter(o); |
65 pw.println(cppGuardBegin()); |
65 pw.println(guardBegin(cname)); |
|
66 pw.println(cppGuardBegin()); |
66 |
67 |
67 /* Write statics. */ |
68 /* Write statics. */ |
68 List<VariableElement> classfields = getAllFields(clazz); |
69 List<VariableElement> classfields = getAllFields(clazz); |
69 |
70 |
70 for (VariableElement v: classfields) { |
71 for (VariableElement v: classfields) { |
71 if (!v.getModifiers().contains(Modifier.STATIC)) |
72 if (!v.getModifiers().contains(Modifier.STATIC)) |
72 continue; |
73 continue; |
73 String s = null; |
74 String s = null; |
74 s = defineForStatic(clazz, v); |
75 s = defineForStatic(clazz, v); |
75 if (s != null) { |
76 if (s != null) { |
76 pw.println(s); |
77 pw.println(s); |
|
78 } |
77 } |
79 } |
|
80 |
|
81 /* Write methods. */ |
|
82 List<ExecutableElement> classmethods = ElementFilter.methodsIn(clazz.getEnclosedElements()); |
|
83 for (ExecutableElement md: classmethods) { |
|
84 if(md.getModifiers().contains(Modifier.NATIVE)){ |
|
85 TypeMirror mtr = types.erasure(md.getReturnType()); |
|
86 String sig = signature(md); |
|
87 TypeSignature newtypesig = new TypeSignature(elems); |
|
88 CharSequence methodName = md.getSimpleName(); |
|
89 boolean longName = false; |
|
90 for (ExecutableElement md2: classmethods) { |
|
91 if ((md2 != md) |
|
92 && (methodName.equals(md2.getSimpleName())) |
|
93 && (md2.getModifiers().contains(Modifier.NATIVE))) |
|
94 longName = true; |
|
95 |
|
96 } |
|
97 pw.println("/*"); |
|
98 pw.println(" * Class: " + cname); |
|
99 pw.println(" * Method: " + |
|
100 mangler.mangle(methodName, Mangle.Type.FIELDSTUB)); |
|
101 pw.println(" * Signature: " + newtypesig.getTypeSignature(sig, mtr)); |
|
102 pw.println(" */"); |
|
103 pw.println("JNIEXPORT " + jniType(mtr) + |
|
104 " JNICALL " + |
|
105 mangler.mangleMethod(md, clazz, |
|
106 (longName) ? |
|
107 Mangle.Type.METHOD_JNI_LONG : |
|
108 Mangle.Type.METHOD_JNI_SHORT)); |
|
109 pw.print(" (JNIEnv *, "); |
|
110 List<? extends VariableElement> paramargs = md.getParameters(); |
|
111 List<TypeMirror> args = new ArrayList<TypeMirror>(); |
|
112 for (VariableElement p: paramargs) { |
|
113 args.add(types.erasure(p.asType())); |
|
114 } |
|
115 if (md.getModifiers().contains(Modifier.STATIC)) |
|
116 pw.print("jclass"); |
|
117 else |
|
118 pw.print("jobject"); |
|
119 |
|
120 for (TypeMirror arg: args) { |
|
121 pw.print(", "); |
|
122 pw.print(jniType(arg)); |
|
123 } |
|
124 pw.println(");" + lineSep); |
|
125 } |
|
126 } |
|
127 pw.println(cppGuardEnd()); |
|
128 pw.println(guardEnd(cname)); |
|
129 } catch (TypeSignature.SignatureException e) { |
|
130 util.error("jni.sigerror", e.getMessage()); |
78 } |
131 } |
79 |
|
80 /* Write methods. */ |
|
81 List<ExecutableElement> classmethods = ElementFilter.methodsIn(clazz.getEnclosedElements()); |
|
82 for (ExecutableElement md: classmethods) { |
|
83 if(md.getModifiers().contains(Modifier.NATIVE)){ |
|
84 TypeMirror mtr = types.erasure(md.getReturnType()); |
|
85 String sig = signature(md); |
|
86 TypeSignature newtypesig = new TypeSignature(elems); |
|
87 CharSequence methodName = md.getSimpleName(); |
|
88 boolean longName = false; |
|
89 for (ExecutableElement md2: classmethods) { |
|
90 if ((md2 != md) |
|
91 && (methodName.equals(md2.getSimpleName())) |
|
92 && (md2.getModifiers().contains(Modifier.NATIVE))) |
|
93 longName = true; |
|
94 |
|
95 } |
|
96 pw.println("/*"); |
|
97 pw.println(" * Class: " + cname); |
|
98 pw.println(" * Method: " + |
|
99 mangler.mangle(methodName, Mangle.Type.FIELDSTUB)); |
|
100 pw.println(" * Signature: " + newtypesig.getTypeSignature(sig, mtr)); |
|
101 pw.println(" */"); |
|
102 pw.println("JNIEXPORT " + jniType(mtr) + |
|
103 " JNICALL " + |
|
104 mangler.mangleMethod(md, clazz, |
|
105 (longName) ? |
|
106 Mangle.Type.METHOD_JNI_LONG : |
|
107 Mangle.Type.METHOD_JNI_SHORT)); |
|
108 pw.print(" (JNIEnv *, "); |
|
109 List<? extends VariableElement> paramargs = md.getParameters(); |
|
110 List<TypeMirror> args = new ArrayList<TypeMirror>(); |
|
111 for (VariableElement p: paramargs) { |
|
112 args.add(types.erasure(p.asType())); |
|
113 } |
|
114 if (md.getModifiers().contains(Modifier.STATIC)) |
|
115 pw.print("jclass"); |
|
116 else |
|
117 pw.print("jobject"); |
|
118 |
|
119 for (TypeMirror arg: args) { |
|
120 pw.print(", "); |
|
121 pw.print(jniType(arg)); |
|
122 } |
|
123 pw.println(");" + lineSep); |
|
124 } |
|
125 } |
|
126 pw.println(cppGuardEnd()); |
|
127 pw.println(guardEnd(cname)); |
|
128 } |
132 } |
129 |
133 |
130 |
134 |
131 protected final String jniType(TypeMirror t) throws Util.Exit { |
135 protected final String jniType(TypeMirror t) throws Util.Exit { |
132 TypeElement throwable = elems.getTypeElement("java.lang.Throwable"); |
136 TypeElement throwable = elems.getTypeElement("java.lang.Throwable"); |