Building C Header and Stub Files: the JavaH Builder
You can generate C header and source files
for implementing native methods,
by using the JavaH Builder.
There are several ways of using the JavaH Builder.
One typical invocation might look like:
classes = Java(target = 'classes', source = 'src/pkg/sub')
JavaH(target = 'native', source = classes)
|
The source is a list of class files generated by the
call to the Java Builder,
and the target is the output directory in
which we want the C header files placed.
The target
gets converted into the -d
when SCons runs javah:
% scons -Q
javac -d classes -sourcepath src/pkg/sub src/pkg/sub/Example1.java src/pkg/sub/Example2.java src/pkg/sub/Example3.java
javah -d native -classpath classes pkg.sub.Example1 pkg.sub.Example2 pkg.sub.Example3
|
In this case,
the call to javah
will generate the header files
native/pkg_sub_Example1.h,
native/pkg_sub_Example2.h
and
native/pkg_sub_Example3.h.
Notice that SCons remembered that the class
files were generated with a target directory of
classes,
and that it then specified that target directory
as the -classpath option
to the call to javah.
Although it's more convenient to use
the list of class files returned by
the Java Builder
as the source of a call to the JavaH Builder,
you can
specify the list of class files
by hand, if you prefer.
If you do,
you need to set the
JAVACLASSDIR construction variable
when calling JavaH:
Java(target = 'classes', source = 'src/pkg/sub')
class_file_list = ['classes/pkg/sub/Example1.class',
'classes/pkg/sub/Example2.class',
'classes/pkg/sub/Example3.class']
JavaH(target = 'native', source = class_file_list, JAVACLASSDIR = 'classes')
|
The JAVACLASSDIR value then
gets converted into the -classpath
when SCons runs javah:
% scons -Q
javac -d classes -sourcepath src/pkg/sub src/pkg/sub/Example1.java src/pkg/sub/Example2.java src/pkg/sub/Example3.java
javah -d native -classpath classes pkg.sub.Example1 pkg.sub.Example2 pkg.sub.Example3
|
Lastly, if you don't want a separate header file
generated for each source file,
you can specify an explicit File Node
as the target of the JavaH Builder:
classes = Java(target = 'classes', source = 'src/pkg/sub')
JavaH(target = File('native.h'), source = classes)
|
Because SCons assumes by default
that the target of the JavaH builder is a directory,
you need to use the File function
to make sure that SCons doesn't
create a directory named native.h.
When a file is used, though,
SCons correctly converts the file name
into the javah -o option:
% scons -Q
javac -d classes -sourcepath src/pkg/sub src/pkg/sub/Example1.java src/pkg/sub/Example2.java src/pkg/sub/Example3.java
javah -o native.h -classpath classes pkg.sub.Example1 pkg.sub.Example2 pkg.sub.Example3
|