1.1 --- a/src/share/classes/com/sun/tools/javah/JNI.java Wed Sep 23 18:48:13 2009 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javah/JNI.java Wed Sep 23 19:15:04 2009 -0700 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved. 1.6 + * Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -27,95 +27,98 @@ 1.11 1.12 import java.io.OutputStream; 1.13 import java.io.PrintWriter; 1.14 -import java.util.Vector; 1.15 -import java.util.Enumeration; 1.16 -import com.sun.javadoc.*; 1.17 +import java.util.ArrayList; 1.18 +import java.util.List; 1.19 +import javax.lang.model.element.Element; 1.20 +import javax.lang.model.element.ExecutableElement; 1.21 +import javax.lang.model.element.Modifier; 1.22 +import javax.lang.model.element.TypeElement; 1.23 +import javax.lang.model.element.VariableElement; 1.24 +import javax.lang.model.type.ArrayType; 1.25 +import javax.lang.model.type.TypeMirror; 1.26 +import javax.lang.model.util.ElementFilter; 1.27 1.28 1.29 /** 1.30 * Header file generator for JNI. 1.31 * 1.32 + * <p><b>This is NOT part of any API supported by Sun Microsystems. 1.33 + * If you write code that depends on this, you do so at your own 1.34 + * risk. This code and its internal interfaces are subject to change 1.35 + * or deletion without notice.</b></p> 1.36 + * 1.37 * @author Sucheta Dambalkar(Revised) 1.38 */ 1.39 - 1.40 public class JNI extends Gen { 1.41 - 1.42 - public JNI(RootDoc root){ 1.43 - super(root); 1.44 + JNI(Util util) { 1.45 + super(util); 1.46 } 1.47 1.48 public String getIncludes() { 1.49 return "#include <jni.h>"; 1.50 } 1.51 1.52 - public void write(OutputStream o, ClassDoc clazz) 1.53 - throws ClassNotFoundException { 1.54 - 1.55 - String cname = Mangle.mangle(clazz.qualifiedName(), Mangle.Type.CLASS); 1.56 + public void write(OutputStream o, TypeElement clazz) throws Util.Exit { 1.57 + String cname = mangler.mangle(clazz.getQualifiedName(), Mangle.Type.CLASS); 1.58 PrintWriter pw = wrapWriter(o); 1.59 pw.println(guardBegin(cname)); 1.60 pw.println(cppGuardBegin()); 1.61 1.62 /* Write statics. */ 1.63 - FieldDoc[] classfields = getAllFields(clazz); 1.64 + List<VariableElement> classfields = getAllFields(clazz); 1.65 1.66 - for (int i = 0; i < classfields.length; i++) { 1.67 - if (!classfields[i].isStatic()) 1.68 + for (VariableElement v: classfields) { 1.69 + if (!v.getModifiers().contains(Modifier.STATIC)) 1.70 continue; 1.71 String s = null; 1.72 - s = defineForStatic(clazz, classfields[i]); 1.73 + s = defineForStatic(clazz, v); 1.74 if (s != null) { 1.75 pw.println(s); 1.76 } 1.77 } 1.78 1.79 /* Write methods. */ 1.80 - MethodDoc[] classmethods = clazz.methods(); 1.81 - for (int i = 0; i < classmethods.length; i++) { 1.82 - if(classmethods[i].isNative()){ 1.83 - MethodDoc md = classmethods[i]; 1.84 - Type mtr = classmethods[i].returnType(); 1.85 - String sig = md.signature(); 1.86 - TypeSignature newtypesig = new TypeSignature(root); 1.87 - String methodName = md.name(); 1.88 + List<ExecutableElement> classmethods = ElementFilter.methodsIn(clazz.getEnclosedElements()); 1.89 + for (ExecutableElement md: classmethods) { 1.90 + if(md.getModifiers().contains(Modifier.NATIVE)){ 1.91 + TypeMirror mtr = types.erasure(md.getReturnType()); 1.92 + String sig = signature(md); 1.93 + TypeSignature newtypesig = new TypeSignature(elems); 1.94 + CharSequence methodName = md.getSimpleName(); 1.95 boolean longName = false; 1.96 - for (int j = 0; j < classmethods.length; j++) { 1.97 - if ((classmethods[j] != md) 1.98 - && (methodName.equals(classmethods[j].name())) 1.99 - && (classmethods[j].isNative())) 1.100 + for (ExecutableElement md2: classmethods) { 1.101 + if ((md2 != md) 1.102 + && (methodName.equals(md2.getSimpleName())) 1.103 + && (md2.getModifiers().contains(Modifier.NATIVE))) 1.104 longName = true; 1.105 1.106 } 1.107 pw.println("/*"); 1.108 pw.println(" * Class: " + cname); 1.109 pw.println(" * Method: " + 1.110 - Mangle.mangle(methodName, Mangle.Type.FIELDSTUB)); 1.111 + mangler.mangle(methodName, Mangle.Type.FIELDSTUB)); 1.112 pw.println(" * Signature: " + newtypesig.getTypeSignature(sig, mtr)); 1.113 pw.println(" */"); 1.114 pw.println("JNIEXPORT " + jniType(mtr) + 1.115 " JNICALL " + 1.116 - Mangle.mangleMethod(md, root,clazz, 1.117 + mangler.mangleMethod(md, clazz, 1.118 (longName) ? 1.119 Mangle.Type.METHOD_JNI_LONG : 1.120 Mangle.Type.METHOD_JNI_SHORT)); 1.121 pw.print(" (JNIEnv *, "); 1.122 - Parameter[] paramargs = md.parameters(); 1.123 - Type []args =new Type[ paramargs.length]; 1.124 - for(int p = 0; p < paramargs.length; p++){ 1.125 - args[p] = paramargs[p].type(); 1.126 + List<? extends VariableElement> paramargs = md.getParameters(); 1.127 + List<TypeMirror> args = new ArrayList<TypeMirror>(); 1.128 + for (VariableElement p: paramargs) { 1.129 + args.add(types.erasure(p.asType())); 1.130 } 1.131 - if (md.isStatic()) 1.132 + if (md.getModifiers().contains(Modifier.STATIC)) 1.133 pw.print("jclass"); 1.134 else 1.135 pw.print("jobject"); 1.136 - if (args.length > 0) 1.137 + 1.138 + for (TypeMirror arg: args) { 1.139 pw.print(", "); 1.140 - 1.141 - for (int j = 0; j < args.length; j++) { 1.142 - pw.print(jniType(args[j])); 1.143 - if (j != (args.length - 1)) { 1.144 - pw.print(", "); 1.145 - } 1.146 + pw.print(jniType(arg)); 1.147 } 1.148 pw.println(");" + lineSep); 1.149 } 1.150 @@ -125,42 +128,54 @@ 1.151 } 1.152 1.153 1.154 - protected final String jniType(Type t){ 1.155 + protected final String jniType(TypeMirror t) throws Util.Exit { 1.156 + TypeElement throwable = elems.getTypeElement("java.lang.Throwable"); 1.157 + TypeElement jClass = elems.getTypeElement("java.lang.Class"); 1.158 + TypeElement jString = elems.getTypeElement("java.lang.String"); 1.159 + Element tclassDoc = types.asElement(t); 1.160 1.161 - String elmT = t.typeName(); 1.162 - ClassDoc throwable = root.classNamed("java.lang.Throwable"); 1.163 - ClassDoc jClass = root.classNamed("java.lang.Class"); 1.164 - ClassDoc tclassDoc = t.asClassDoc(); 1.165 1.166 - if((t.dimension()).indexOf("[]") != -1){ 1.167 - if((t.dimension().indexOf("[][]") != -1) 1.168 - || (tclassDoc != null)) return "jobjectArray"; 1.169 - else if(elmT.equals("boolean"))return "jbooleanArray"; 1.170 - else if(elmT.equals("byte"))return "jbyteArray"; 1.171 - else if(elmT.equals("char"))return "jcharArray"; 1.172 - else if(elmT.equals("short"))return "jshortArray"; 1.173 - else if(elmT.equals("int"))return "jintArray"; 1.174 - else if(elmT.equals("long"))return "jlongArray"; 1.175 - else if(elmT.equals("float"))return "jfloatArray"; 1.176 - else if(elmT.equals("double"))return "jdoubleArray"; 1.177 - }else{ 1.178 - if(elmT.equals("void"))return "void"; 1.179 - else if(elmT.equals("String"))return "jstring"; 1.180 - else if(elmT.equals("boolean"))return "jboolean"; 1.181 - else if(elmT.equals("byte"))return "jbyte"; 1.182 - else if(elmT.equals("char"))return "jchar"; 1.183 - else if(elmT.equals("short"))return "jshort"; 1.184 - else if(elmT.equals("int"))return "jint"; 1.185 - else if(elmT.equals("long"))return "jlong"; 1.186 - else if(elmT.equals("float"))return "jfloat"; 1.187 - else if(elmT.equals("double"))return "jdouble"; 1.188 - else if(tclassDoc != null){ 1.189 - if(tclassDoc.subclassOf(throwable)) return "jthrowable"; 1.190 - else if(tclassDoc.subclassOf(jClass)) return "jclass"; 1.191 - else return "jobject"; 1.192 + switch (t.getKind()) { 1.193 + case ARRAY: { 1.194 + TypeMirror ct = ((ArrayType) t).getComponentType(); 1.195 + switch (ct.getKind()) { 1.196 + case BOOLEAN: return "jbooleanArray"; 1.197 + case BYTE: return "jbyteArray"; 1.198 + case CHAR: return "jcharArray"; 1.199 + case SHORT: return "jshortArray"; 1.200 + case INT: return "jintArray"; 1.201 + case LONG: return "jlongArray"; 1.202 + case FLOAT: return "jfloatArray"; 1.203 + case DOUBLE: return "jdoubleArray"; 1.204 + case ARRAY: 1.205 + case DECLARED: return "jobjectArray"; 1.206 + default: throw new Error(ct.toString()); 1.207 + } 1.208 + } 1.209 + 1.210 + case VOID: return "void"; 1.211 + case BOOLEAN: return "jboolean"; 1.212 + case BYTE: return "jbyte"; 1.213 + case CHAR: return "jchar"; 1.214 + case SHORT: return "jshort"; 1.215 + case INT: return "jint"; 1.216 + case LONG: return "jlong"; 1.217 + case FLOAT: return "jfloat"; 1.218 + case DOUBLE: return "jdouble"; 1.219 + 1.220 + case DECLARED: { 1.221 + if (tclassDoc.equals(jString)) 1.222 + return "jstring"; 1.223 + else if (types.isAssignable(t, throwable.asType())) 1.224 + return "jthrowable"; 1.225 + else if (types.isAssignable(t, jClass.asType())) 1.226 + return "jclass"; 1.227 + else 1.228 + return "jobject"; 1.229 } 1.230 } 1.231 - Util.bug("jni.unknown.type"); 1.232 + 1.233 + util.bug("jni.unknown.type"); 1.234 return null; /* dead code. */ 1.235 } 1.236 }