home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / java / util / linker.java < prev    next >
Text File  |  1995-08-11  |  4KB  |  122 lines

  1. /*
  2.  * @(#)Linker.java    1.12 95/05/30 Arthur van Hoff
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19. package java.util;
  20.  
  21. import java.io.File;
  22.  
  23. /**
  24.  * A class to encapsulates dynamic linking.
  25.  * This class allows the system to dynamically link in new libraries containing
  26.  * the implementation of native methods. Here is an example of what such a
  27.  * class may look like:
  28.  * <pre>
  29.  *     class MPEGDecoder {
  30.  *        public native decode(InputStream s);
  31.  *
  32.  *        static {
  33.  *        Linker.loadLibrary("mpeg");
  34.  *        }    
  35.  *     }
  36.  * </pre>
  37.  * The functionality in this class is very system dependent.
  38.  *
  39.  * @version     1.12, 30 May 1995
  40.  * @author    Arthur van Hoff
  41.  */
  42.  
  43. public final
  44. class Linker {
  45.     /** Makes sure nobody instantiates it */
  46.     private Linker() {
  47.     }
  48.     
  49.     /** The paths searched for libraries */
  50.     private static String paths[];
  51.  
  52.     /**
  53.      * Initializes the linker (adds the INSTALLPATH to the LD_LIBRARY_PATH),
  54.      * and  returns the value of the environment variable LD_LIBRARY_PATH.
  55.      */
  56.     private static synchronized native String initialize();
  57.     private static native String buildLibName(String pathname, String filename);
  58.  
  59.     static {
  60.     String ldpath = initialize();
  61.     int c = File.pathSeparatorChar;
  62.     int ldlen = ldpath.length();
  63.     int i, j, n;
  64.     // Count the separators in the path
  65.     i = ldpath.indexOf(c);
  66.     n = 0;
  67.     while (i >= 0) {
  68.         n++;
  69.         i = ldpath.indexOf(c, i+1);
  70.     }
  71.  
  72.     // allocate the array of paths - n :'s = n + 1 path elements
  73.     paths = new String[n + 1];
  74.  
  75.     // Fill the array with paths from the ldpath
  76.     n = i = 0;
  77.     j = ldpath.indexOf(c);
  78.     while (j >= 0) {
  79.         if (j - i > 0) {
  80.         paths[n++] = ldpath.substring(i, j);
  81.         }
  82.         i = j + 1;
  83.         j = ldpath.indexOf(c, i);
  84.     }
  85.     paths[n] = ldpath.substring(i, ldlen);
  86.     }
  87.     
  88.     /*
  89.      * Loads a dynamic library, given a complete path name. If you use this
  90.      * from java_g it will automagically insert "_g" before the ".so".
  91.      * It will throw an UnsatisfiedLinkException if the file does not
  92.      * exist.
  93.      *
  94.      * Example: Linker.load("/home/avh/lib/libX11.so");
  95.      */
  96.     public static synchronized native void load(String filename);
  97.  
  98.     /**
  99.      * Loads a dynamic library given a library name. The call to LoadLibrary
  100.      * should be made in the static initializer of the first class that is
  101.      * loaded. Linking in the same library more than once is ignored.
  102.      * @param libname the name of the library
  103.      * @exception UnsatisfiedLinkException Something went wrong
  104.      */
  105.     public static synchronized void loadLibrary(String libname) {
  106.  
  107.     for (int i = 0 ; i < paths.length ; i++) {
  108.         try {
  109.         String tempname = buildLibName(paths[i], libname);
  110.         Linker.load(tempname);
  111.         return;
  112.         } catch (UnsatisfiedLinkException e) {
  113.         }
  114.     }
  115.  
  116.     // Oops, it failed
  117.     UnsatisfiedLinkException e = new
  118.         UnsatisfiedLinkException("no " + libname + " in LD_LIBRARY_PATH");
  119.     throw e;
  120.     }
  121. }
  122.