The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/Documentation/java.txt

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1                Java(tm) Binary Kernel Support for Linux v1.03
    2                ----------------------------------------------
    3 
    4 Linux beats them ALL! While all other OS's are TALKING about direct
    5 support of Java Binaries in the OS, Linux is doing it!
    6 
    7 You can execute Java applications and Java Applets just like any
    8 other program after you have done the following:
    9 
   10 1) You MUST FIRST install the Java Developers Kit for Linux.
   11    The Java on Linux HOWTO gives the details on getting and
   12    installing this. This HOWTO can be found at:
   13 
   14         ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/Java-HOWTO
   15 
   16    You should also set up a reasonable CLASSPATH environment
   17    variable to use Java applications that make use of any
   18    nonstandard classes (not included in the same directory
   19    as the application itself).
   20 
   21 2) You have to compile BINFMT_MISC either as a module or into
   22    the kernel (CONFIG_BINFMT_MISC) and set it up properly.
   23    If you choose to compile it as a module, you will have
   24    to insert it manually with modprobe/insmod, as kmod
   25    cannot easily be supported with binfmt_misc. 
   26    Read the file 'binfmt_misc.txt' in this directory to know
   27    more about the configuration process.
   28 
   29 3) Add the following configuration items to binfmt_misc
   30    (you should really have read binfmt_misc.txt now):
   31    support for Java applications:
   32      ':Java:M::\xca\xfe\xba\xbe::/usr/local/bin/javawrapper:'
   33    support for executable Jar files:
   34      ':ExecutableJAR:E::jar::/usr/local/bin/jarwrapper:'
   35    support for Java Applets:
   36      ':Applet:E::html::/usr/bin/appletviewer:'
   37    or the following, if you want to be more selective:
   38      ':Applet:M::<!--applet::/usr/bin/appletviewer:'
   39 
   40    Of course you have to fix the path names. The path/file names given in this
   41    document match the Debian 2.1 system. (i.e. jdk installed in /usr,
   42    custom wrappers from this document in /usr/local)
   43 
   44    Note, that for the more selective applet support you have to modify
   45    existing html-files to contain <!--applet--> in the first line
   46    ('<' has to be the first character!) to let this work!
   47 
   48    For the compiled Java programs you need a wrapper script like the
   49    following (this is because Java is broken in case of the filename
   50    handling), again fix the path names, both in the script and in the
   51    above given configuration string.
   52 
   53    You, too, need the little program after the script. Compile like
   54    gcc -O2 -o javaclassname javaclassname.c
   55    and stick it to /usr/local/bin.
   56 
   57    Both the javawrapper shellscript and the javaclassname program
   58    were supplied by Colin J. Watson <cjw44@cam.ac.uk>.
   59 
   60 ====================== Cut here ===================
   61 #!/bin/bash
   62 # /usr/local/bin/javawrapper - the wrapper for binfmt_misc/java
   63 
   64 if [ -z "$1" ]; then
   65         exec 1>&2
   66         echo Usage: $0 class-file
   67         exit 1
   68 fi
   69 
   70 CLASS=$1
   71 FQCLASS=`/usr/local/bin/javaclassname $1`
   72 FQCLASSN=`echo $FQCLASS | sed -e 's/^.*\.\([^.]*\)$/\1/'`
   73 FQCLASSP=`echo $FQCLASS | sed -e 's-\.-/-g' -e 's-^[^/]*$--' -e 's-/[^/]*$--'`
   74 
   75 # for example:
   76 # CLASS=Test.class
   77 # FQCLASS=foo.bar.Test
   78 # FQCLASSN=Test
   79 # FQCLASSP=foo/bar
   80 
   81 unset CLASSBASE
   82 
   83 declare -i LINKLEVEL=0
   84 
   85 while :; do
   86         if [ "`basename $CLASS .class`" == "$FQCLASSN" ]; then
   87                 # See if this directory works straight off
   88                 cd -L `dirname $CLASS`
   89                 CLASSDIR=$PWD
   90                 cd $OLDPWD
   91                 if echo $CLASSDIR | grep -q "$FQCLASSP$"; then
   92                         CLASSBASE=`echo $CLASSDIR | sed -e "s.$FQCLASSP$.."`
   93                         break;
   94                 fi
   95                 # Try dereferencing the directory name
   96                 cd -P `dirname $CLASS`
   97                 CLASSDIR=$PWD
   98                 cd $OLDPWD
   99                 if echo $CLASSDIR | grep -q "$FQCLASSP$"; then
  100                         CLASSBASE=`echo $CLASSDIR | sed -e "s.$FQCLASSP$.."`
  101                         break;
  102                 fi
  103                 # If no other possible filename exists
  104                 if [ ! -L $CLASS ]; then
  105                         exec 1>&2
  106                         echo $0:
  107                         echo "  $CLASS should be in a" \
  108                              "directory tree called $FQCLASSP"
  109                         exit 1
  110                 fi
  111         fi
  112         if [ ! -L $CLASS ]; then break; fi
  113         # Go down one more level of symbolic links
  114         let LINKLEVEL+=1
  115         if [ $LINKLEVEL -gt 5 ]; then
  116                 exec 1>&2
  117                 echo $0:
  118                 echo "  Too many symbolic links encountered"
  119                 exit 1
  120         fi
  121         CLASS=`ls --color=no -l $CLASS | sed -e 's/^.* \([^ ]*\)$/\1/'`
  122 done
  123 
  124 if [ -z "$CLASSBASE" ]; then
  125         if [ -z "$FQCLASSP" ]; then
  126                 GOODNAME=$FQCLASSN.class
  127         else
  128                 GOODNAME=$FQCLASSP/$FQCLASSN.class
  129         fi
  130         exec 1>&2
  131         echo $0:
  132         echo "  $FQCLASS should be in a file called $GOODNAME"
  133         exit 1
  134 fi
  135 
  136 if ! echo $CLASSPATH | grep -q "^\(.*:\)*$CLASSBASE\(:.*\)*"; then
  137         # class is not in CLASSPATH, so prepend dir of class to CLASSPATH
  138         if [ -z "${CLASSPATH}" ] ; then
  139                 export CLASSPATH=$CLASSBASE
  140         else
  141                 export CLASSPATH=$CLASSBASE:$CLASSPATH
  142         fi
  143 fi
  144 
  145 shift
  146 /usr/bin/java $FQCLASS "$@"
  147 ====================== Cut here ===================
  148 
  149 
  150 ====================== Cut here ===================
  151 /* javaclassname.c
  152  *
  153  * Extracts the class name from a Java class file; intended for use in a Java
  154  * wrapper of the type supported by the binfmt_misc option in the Linux kernel.
  155  *
  156  * Copyright (C) 1999 Colin J. Watson <cjw44@cam.ac.uk>.
  157  *
  158  * This program is free software; you can redistribute it and/or modify
  159  * it under the terms of the GNU General Public License as published by
  160  * the Free Software Foundation; either version 2 of the License, or
  161  * (at your option) any later version.
  162  *
  163  * This program is distributed in the hope that it will be useful,
  164  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  165  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  166  * GNU General Public License for more details.
  167  *
  168  * You should have received a copy of the GNU General Public License
  169  * along with this program; if not, write to the Free Software
  170  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  171  */
  172 
  173 #include <stdlib.h>
  174 #include <stdio.h>
  175 #include <stdarg.h>
  176 #include <sys/types.h>
  177 
  178 /* From Sun's Java VM Specification, as tag entries in the constant pool. */
  179 
  180 #define CP_UTF8 1
  181 #define CP_INTEGER 3
  182 #define CP_FLOAT 4
  183 #define CP_LONG 5
  184 #define CP_DOUBLE 6
  185 #define CP_CLASS 7
  186 #define CP_STRING 8
  187 #define CP_FIELDREF 9
  188 #define CP_METHODREF 10
  189 #define CP_INTERFACEMETHODREF 11
  190 #define CP_NAMEANDTYPE 12
  191 
  192 /* Define some commonly used error messages */
  193 
  194 #define seek_error() error("%s: Cannot seek\n", program)
  195 #define corrupt_error() error("%s: Class file corrupt\n", program)
  196 #define eof_error() error("%s: Unexpected end of file\n", program)
  197 #define utf8_error() error("%s: Only ASCII 1-255 supported\n", program);
  198 
  199 char *program;
  200 
  201 long *pool;
  202 
  203 u_int8_t read_8(FILE *classfile);
  204 u_int16_t read_16(FILE *classfile);
  205 void skip_constant(FILE *classfile, u_int16_t *cur);
  206 void error(const char *format, ...);
  207 int main(int argc, char **argv);
  208 
  209 /* Reads in an unsigned 8-bit integer. */
  210 u_int8_t read_8(FILE *classfile)
  211 {
  212         int b = fgetc(classfile);
  213         if(b == EOF)
  214                 eof_error();
  215         return (u_int8_t)b;
  216 }
  217 
  218 /* Reads in an unsigned 16-bit integer. */
  219 u_int16_t read_16(FILE *classfile)
  220 {
  221         int b1, b2;
  222         b1 = fgetc(classfile);
  223         if(b1 == EOF)
  224                 eof_error();
  225         b2 = fgetc(classfile);
  226         if(b2 == EOF)
  227                 eof_error();
  228         return (u_int16_t)((b1 << 8) | b2);
  229 }
  230 
  231 /* Reads in a value from the constant pool. */
  232 void skip_constant(FILE *classfile, u_int16_t *cur)
  233 {
  234         u_int16_t len;
  235         int seekerr = 1;
  236         pool[*cur] = ftell(classfile);
  237         switch(read_8(classfile))
  238         {
  239         case CP_UTF8:
  240                 len = read_16(classfile);
  241                 seekerr = fseek(classfile, len, SEEK_CUR);
  242                 break;
  243         case CP_CLASS:
  244         case CP_STRING:
  245                 seekerr = fseek(classfile, 2, SEEK_CUR);
  246                 break;
  247         case CP_INTEGER:
  248         case CP_FLOAT:
  249         case CP_FIELDREF:
  250         case CP_METHODREF:
  251         case CP_INTERFACEMETHODREF:
  252         case CP_NAMEANDTYPE:
  253                 seekerr = fseek(classfile, 4, SEEK_CUR);
  254                 break;
  255         case CP_LONG:
  256         case CP_DOUBLE:
  257                 seekerr = fseek(classfile, 8, SEEK_CUR);
  258                 ++(*cur);
  259                 break;
  260         default:
  261                 corrupt_error();
  262         }
  263         if(seekerr)
  264                 seek_error();
  265 }
  266 
  267 void error(const char *format, ...)
  268 {
  269         va_list ap;
  270         va_start(ap, format);
  271         vfprintf(stderr, format, ap);
  272         va_end(ap);
  273         exit(1);
  274 }
  275 
  276 int main(int argc, char **argv)
  277 {
  278         FILE *classfile;
  279         u_int16_t cp_count, i, this_class, classinfo_ptr;
  280         u_int8_t length;
  281 
  282         program = argv[0];
  283 
  284         if(!argv[1])
  285                 error("%s: Missing input file\n", program);
  286         classfile = fopen(argv[1], "rb");
  287         if(!classfile)
  288                 error("%s: Error opening %s\n", program, argv[1]);
  289 
  290         if(fseek(classfile, 8, SEEK_SET))  /* skip magic and version numbers */
  291                 seek_error();
  292         cp_count = read_16(classfile);
  293         pool = calloc(cp_count, sizeof(long));
  294         if(!pool)
  295                 error("%s: Out of memory for constant pool\n", program);
  296 
  297         for(i = 1; i < cp_count; ++i)
  298                 skip_constant(classfile, &i);
  299         if(fseek(classfile, 2, SEEK_CUR))       /* skip access flags */
  300                 seek_error();
  301 
  302         this_class = read_16(classfile);
  303         if(this_class < 1 || this_class >= cp_count)
  304                 corrupt_error();
  305         if(!pool[this_class] || pool[this_class] == -1)
  306                 corrupt_error();
  307         if(fseek(classfile, pool[this_class] + 1, SEEK_SET))
  308                 seek_error();
  309 
  310         classinfo_ptr = read_16(classfile);
  311         if(classinfo_ptr < 1 || classinfo_ptr >= cp_count)
  312                 corrupt_error();
  313         if(!pool[classinfo_ptr] || pool[classinfo_ptr] == -1)
  314                 corrupt_error();
  315         if(fseek(classfile, pool[classinfo_ptr] + 1, SEEK_SET))
  316                 seek_error();
  317 
  318         length = read_16(classfile);
  319         for(i = 0; i < length; ++i)
  320         {
  321                 u_int8_t x = read_8(classfile);
  322                 if((x & 0x80) || !x)
  323                 {
  324                         if((x & 0xE0) == 0xC0)
  325                         {
  326                                 u_int8_t y = read_8(classfile);
  327                                 if((y & 0xC0) == 0x80)
  328                                 {
  329                                         int c = ((x & 0x1f) << 6) + (y & 0x3f);
  330                                         if(c) putchar(c);
  331                                         else utf8_error();
  332                                 }
  333                                 else utf8_error();
  334                         }
  335                         else utf8_error();
  336                 }
  337                 else if(x == '/') putchar('.');
  338                 else putchar(x);
  339         }
  340         putchar('\n');
  341         free(pool);
  342         fclose(classfile);
  343         return 0;
  344 }
  345 ====================== Cut here ===================
  346 
  347 
  348 ====================== Cut here ===================
  349 #!/bin/bash
  350 # /usr/local/java/bin/jarwrapper - the wrapper for binfmt_misc/jar
  351 
  352 java -jar $1
  353 ====================== Cut here ===================
  354 
  355 
  356 Now simply chmod +x the .class, .jar and/or .html files you want to execute.
  357 To add a Java program to your path best put a symbolic link to the main
  358 .class file into /usr/bin (or another place you like) omitting the .class
  359 extension. The directory containing the original .class file will be
  360 added to your CLASSPATH during execution.
  361 
  362 
  363 To test your new setup, enter in the following simple Java app, and name
  364 it "HelloWorld.java":
  365 
  366         class HelloWorld {
  367                 public static void main(String args[]) {
  368                         System.out.println("Hello World!");
  369                 }
  370         }
  371 
  372 Now compile the application with:
  373         javac HelloWorld.java
  374 
  375 Set the executable permissions of the binary file, with:
  376         chmod 755 HelloWorld.class
  377 
  378 And then execute it:
  379         ./HelloWorld.class
  380 
  381 
  382 To execute Java Jar files, simple chmod the *.jar files to include
  383 the execution bit, then just do
  384        ./Application.jar
  385 
  386 
  387 To execute Java Applets, simple chmod the *.html files to include
  388 the execution bit, then just do
  389         ./Applet.html
  390 
  391 
  392 originally by Brian A. Lantz, brian@lantz.com
  393 heavily edited for binfmt_misc by Richard Günther
  394 new scripts by Colin J. Watson <cjw44@cam.ac.uk>
  395 added executable Jar file support by Kurt Huwig <kurt@iku-netz.de>
  396 

Cache object: ff39608d572d40bbad02efb9cb458d32


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.