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

Sat, 01 Dec 2007 00:00:00 +0000

author
duke
date
Sat, 01 Dec 2007 00:00:00 +0000
changeset 1
9a66ca7c79fa
child 416
c287d51c57da
permissions
-rw-r--r--

Initial load

duke@1 1 /*
duke@1 2 * Copyright 2002-2005 Sun Microsystems, Inc. All Rights Reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
duke@1 7 * published by the Free Software Foundation. Sun designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
duke@1 9 * by Sun in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
duke@1 21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
duke@1 22 * CA 95054 USA or visit www.sun.com if you need additional information or
duke@1 23 * have any questions.
duke@1 24 */
duke@1 25
duke@1 26 package com.sun.tools.javah;
duke@1 27
duke@1 28 import java.io.OutputStream;
duke@1 29 import java.io.PrintWriter;
duke@1 30 import java.util.Vector;
duke@1 31 import java.util.Enumeration;
duke@1 32 import com.sun.javadoc.*;
duke@1 33
duke@1 34
duke@1 35 /**
duke@1 36 * Header file generator for JNI.
duke@1 37 *
duke@1 38 * @author Sucheta Dambalkar(Revised)
duke@1 39 */
duke@1 40
duke@1 41 public class JNI extends Gen {
duke@1 42
duke@1 43 public JNI(RootDoc root){
duke@1 44 super(root);
duke@1 45 }
duke@1 46
duke@1 47 public String getIncludes() {
duke@1 48 return "#include <jni.h>";
duke@1 49 }
duke@1 50
duke@1 51 public void write(OutputStream o, ClassDoc clazz)
duke@1 52 throws ClassNotFoundException {
duke@1 53
duke@1 54 String cname = Mangle.mangle(clazz.qualifiedName(), Mangle.Type.CLASS);
duke@1 55 PrintWriter pw = wrapWriter(o);
duke@1 56 pw.println(guardBegin(cname));
duke@1 57 pw.println(cppGuardBegin());
duke@1 58
duke@1 59 /* Write statics. */
duke@1 60 FieldDoc[] classfields = getAllFields(clazz);
duke@1 61
duke@1 62 for (int i = 0; i < classfields.length; i++) {
duke@1 63 if (!classfields[i].isStatic())
duke@1 64 continue;
duke@1 65 String s = null;
duke@1 66 s = defineForStatic(clazz, classfields[i]);
duke@1 67 if (s != null) {
duke@1 68 pw.println(s);
duke@1 69 }
duke@1 70 }
duke@1 71
duke@1 72 /* Write methods. */
duke@1 73 MethodDoc[] classmethods = clazz.methods();
duke@1 74 for (int i = 0; i < classmethods.length; i++) {
duke@1 75 if(classmethods[i].isNative()){
duke@1 76 MethodDoc md = classmethods[i];
duke@1 77 Type mtr = classmethods[i].returnType();
duke@1 78 String sig = md.signature();
duke@1 79 TypeSignature newtypesig = new TypeSignature(root);
duke@1 80 String methodName = md.name();
duke@1 81 boolean longName = false;
duke@1 82 for (int j = 0; j < classmethods.length; j++) {
duke@1 83 if ((classmethods[j] != md)
duke@1 84 && (methodName.equals(classmethods[j].name()))
duke@1 85 && (classmethods[j].isNative()))
duke@1 86 longName = true;
duke@1 87
duke@1 88 }
duke@1 89 pw.println("/*");
duke@1 90 pw.println(" * Class: " + cname);
duke@1 91 pw.println(" * Method: " +
duke@1 92 Mangle.mangle(methodName, Mangle.Type.FIELDSTUB));
duke@1 93 pw.println(" * Signature: " + newtypesig.getTypeSignature(sig, mtr));
duke@1 94 pw.println(" */");
duke@1 95 pw.println("JNIEXPORT " + jniType(mtr) +
duke@1 96 " JNICALL " +
duke@1 97 Mangle.mangleMethod(md, root,clazz,
duke@1 98 (longName) ?
duke@1 99 Mangle.Type.METHOD_JNI_LONG :
duke@1 100 Mangle.Type.METHOD_JNI_SHORT));
duke@1 101 pw.print(" (JNIEnv *, ");
duke@1 102 Parameter[] paramargs = md.parameters();
duke@1 103 Type []args =new Type[ paramargs.length];
duke@1 104 for(int p = 0; p < paramargs.length; p++){
duke@1 105 args[p] = paramargs[p].type();
duke@1 106 }
duke@1 107 if (md.isStatic())
duke@1 108 pw.print("jclass");
duke@1 109 else
duke@1 110 pw.print("jobject");
duke@1 111 if (args.length > 0)
duke@1 112 pw.print(", ");
duke@1 113
duke@1 114 for (int j = 0; j < args.length; j++) {
duke@1 115 pw.print(jniType(args[j]));
duke@1 116 if (j != (args.length - 1)) {
duke@1 117 pw.print(", ");
duke@1 118 }
duke@1 119 }
duke@1 120 pw.println(");" + lineSep);
duke@1 121 }
duke@1 122 }
duke@1 123 pw.println(cppGuardEnd());
duke@1 124 pw.println(guardEnd(cname));
duke@1 125 }
duke@1 126
duke@1 127
duke@1 128 protected final String jniType(Type t){
duke@1 129
duke@1 130 String elmT = t.typeName();
duke@1 131 ClassDoc throwable = root.classNamed("java.lang.Throwable");
duke@1 132 ClassDoc jClass = root.classNamed("java.lang.Class");
duke@1 133 ClassDoc tclassDoc = t.asClassDoc();
duke@1 134
duke@1 135 if((t.dimension()).indexOf("[]") != -1){
duke@1 136 if((t.dimension().indexOf("[][]") != -1)
duke@1 137 || (tclassDoc != null)) return "jobjectArray";
duke@1 138 else if(elmT.equals("boolean"))return "jbooleanArray";
duke@1 139 else if(elmT.equals("byte"))return "jbyteArray";
duke@1 140 else if(elmT.equals("char"))return "jcharArray";
duke@1 141 else if(elmT.equals("short"))return "jshortArray";
duke@1 142 else if(elmT.equals("int"))return "jintArray";
duke@1 143 else if(elmT.equals("long"))return "jlongArray";
duke@1 144 else if(elmT.equals("float"))return "jfloatArray";
duke@1 145 else if(elmT.equals("double"))return "jdoubleArray";
duke@1 146 }else{
duke@1 147 if(elmT.equals("void"))return "void";
duke@1 148 else if(elmT.equals("String"))return "jstring";
duke@1 149 else if(elmT.equals("boolean"))return "jboolean";
duke@1 150 else if(elmT.equals("byte"))return "jbyte";
duke@1 151 else if(elmT.equals("char"))return "jchar";
duke@1 152 else if(elmT.equals("short"))return "jshort";
duke@1 153 else if(elmT.equals("int"))return "jint";
duke@1 154 else if(elmT.equals("long"))return "jlong";
duke@1 155 else if(elmT.equals("float"))return "jfloat";
duke@1 156 else if(elmT.equals("double"))return "jdouble";
duke@1 157 else if(tclassDoc != null){
duke@1 158 if(tclassDoc.subclassOf(throwable)) return "jthrowable";
duke@1 159 else if(tclassDoc.subclassOf(jClass)) return "jclass";
duke@1 160 else return "jobject";
duke@1 161 }
duke@1 162 }
duke@1 163 Util.bug("jni.unknown.type");
duke@1 164 return null; /* dead code. */
duke@1 165 }
duke@1 166 }

mercurial