langtools/src/share/classes/com/sun/tools/javah/JNI.java
changeset 6930 b6fea484cbb2
parent 5847 1908176fd6e3
child 7681 1f0819a3341f
equal deleted inserted replaced
6929:81a6a7c1bef1 6930:b6fea484cbb2
    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");