src/share/classes/com/sun/tools/javah/JNI.java

changeset 416
c287d51c57da
parent 1
9a66ca7c79fa
child 554
9d9f26857129
     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  }

mercurial