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