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.