bodewig     2003/04/09 06:36:32

  Modified:    .        WHATSNEW
               src/main/org/apache/tools/ant/taskdefs/optional Javah.java
  Log:
  Make <javah> work on JDK 1.4.2.
  
  PR: 18667
  Submitted by: James Allers <jallers at advancedreality dot com>
  
  Revision  Changes    Path
  1.392     +2 -0      ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.391
  retrieving revision 1.392
  diff -u -r1.391 -r1.392
  --- WHATSNEW  9 Apr 2003 13:15:31 -0000       1.391
  +++ WHATSNEW  9 Apr 2003 13:36:32 -0000       1.392
  @@ -225,6 +225,8 @@
   
   * <sql> has a new attribute to control escape processing.
   
  +* <javah> will invoke oldjavah on JDK 1.4.2.  Bugzilla Report 18667.
  +
   Changes from Ant 1.5.2 to Ant 1.5.3
   ===================================
   
  
  
  
  1.22      +25 -9     
ant/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java
  
  Index: Javah.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/Javah.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- Javah.java        10 Feb 2003 14:13:45 -0000      1.21
  +++ Javah.java        9 Apr 2003 13:36:32 -0000       1.22
  @@ -55,6 +55,8 @@
   package org.apache.tools.ant.taskdefs.optional;
   
   import java.io.File;
  +import java.lang.reflect.Constructor;
  +import java.lang.reflect.Method;
   import java.util.Enumeration;
   import java.util.StringTokenizer;
   import java.util.Vector;
  @@ -335,15 +337,29 @@
               throw new BuildException("Compile failed");
           }
           */
  +        
  +            
           try {
  -            // Javac uses logstr to change the output stream and calls
  -            // the constructor's invoke method to create a compiler instance
  -            // dynamically. However, javah has a different interface and this
  -            // makes it harder, so here's a simple alternative.
  -            
//------------------------------------------------------------------
  -            com.sun.tools.javah.Main main 
  -                = new com.sun.tools.javah.Main(cmd.getArguments());
  -            main.run();
  +            Class javahMainClass = null;
  +            try {
  +                // first search for the "old" javah class in 1.4.2 tools.jar
  +                javahMainClass = 
Class.forName("com.sun.tools.javah.oldjavah.Main");
  +            } catch(ClassNotFoundException cnfe) {
  +                // assume older than 1.4.2 tools.jar
  +                javahMainClass = Class.forName("com.sun.tools.javah.Main");
  +            }
  +            
  +            // now search for the constructor that takes in String[] 
arguments.
  +            Class[] strings = new Class[] {String[].class};
  +            Constructor constructor = javahMainClass.getConstructor(strings);
  +            
  +            // construct the javah Main instance
  +            Object javahMain = constructor.newInstance(new Object[] 
{cmd.getArguments()});
  +            
  +            // find the run method
  +            Method runMethod = javahMainClass.getMethod("run",new Class[0]);
  +            
  +            runMethod.invoke(javahMain,new Object[0]);
           } catch (Exception ex) {
               if (ex instanceof BuildException) {
                   throw (BuildException) ex;
  @@ -352,7 +368,7 @@
               }
           }
       }
  -
  +        
       /**
        * Does the command line argument processing common to classic and
        * modern.
  
  
  

Reply via email to