从 Java 类生成 JNI 头文件。
当此任务执行时,它将生成实现本机方法所需的 C 头文件和源文件。
如果您使用的是 Java 8 或更高版本,请考虑使用 javac
的 nativeheaderdir 属性,它允许您在单个步骤中编译类并生成本机头文件。
注意:javah
在 Java 9 中已弃用,并在 Java 10 中删除。尝试在 Java 10 中使用它将失败。
可以使用不同的编译器。这可以通过 implementation 属性或嵌套元素进行选择。以下是属性的选择
default—平台的默认编译器。
sun—JDK 的标准编译器。
kaffeh—Kaffe 的本机标准编译器。
gcjh—gcj 和 gij 的本机标准编译器。自 Apache Ant 1.8.2 起
forking—通过其命令行界面在单独的进程中运行 javah 可执行文件。自 Ant 1.9.8 起,在非 Kaffe 或 gcj/gij 上运行时为默认值
注意:如果您使用此任务处理多个文件,则某些操作系统上的命令行可能会过长。不幸的是,javah 命令不支持像 javac(例如)那样支持命令参数文件,因此只能将要编译的类数量分成更小的块。
属性 | 描述 | 必需 |
---|---|---|
class | 类的完全限定名(或类,用逗号分隔) | 是 |
outputFile | 将所有列出类的结果头文件或源文件连接到此文件中 | 两者之一 |
destdir | 设置 javah 保存头文件或存根文件的目录。 | |
force | 指定应始终写入输出文件(仅在使用 JDK 1.2 的外部 javah 时) | 否 |
old | 指定应生成旧的 JDK 1.0 风格的头文件(否则输出文件包含 JNI 风格的本机方法函数原型)(仅在使用 JDK 1.2 的外部 javah 时) | 否 |
stubs | 从 Java 对象文件生成 C 声明(与 old 一起使用) | 否 |
verbose | 导致 javah 打印有关生成文件状态的消息 | 否 |
classpath | 要使用的类路径 | 否 |
bootclasspath | 引导类文件的位置 | 否 |
extdirs | 已安装扩展的位置 | 否 |
implementation | 要使用的编译器实现。(参见上面 列表 中的有效编译器。) | 否;默认为当前 JDK 的默认编译器 |
您可以使用嵌套的 <arg>
元素为编译器指定其他命令行参数。这些元素的指定方式与 命令行参数 相同,但有一个额外的属性可用于仅在使用给定编译器实现时启用参数。
属性 | 描述 | 必需 |
---|---|---|
value | 参见 命令行参数。 | 这些之一 |
line | ||
file | ||
path | ||
prefix | 参见 命令行参数。自 Ant 1.8 起。 | 否 |
suffix | 否 | |
implementation | 仅在所选编译器实现与该属性的值匹配时才传递指定的参数。合法值与上面 列表 中的有效编译器相同。) | 否 |
自 Ant 1.8.0 起
一个 类似路径的结构,它保存加载编译器实现时要使用的类路径,如果指定了自定义类。在使用内置编译器之一时没有影响。
自 Ant 1.8.0 起
如果定义的类型实现了 JavahAdapter
接口,则可以使用该类型的嵌套元素作为 implementation 属性的替代方法。
使用 JDK 1.2 JNI 模型创建命名类的 JNI 头文件。假设目录 c 已经存在,文件 org_foo_bar_Wibble.h 将在其中创建。如果此文件已存在,则保持不变。
<javah destdir="c" class="org.foo.bar.Wibble"/>
这与前面的示例类似,只是输出写入当前目录中的名为 wibble.h 的文件。
<javah outputFile="wibble.h"> <class name="org.foo.bar.Wibble,org.foo.bar.Bobble"/> </javah>
写入三个头文件,每个命名类一个。由于设置了 force 选项,因此在调用 Javah
任务时始终写入这些头文件,即使它们已存在。
<javah destdir="c" force="yes"> <class name="org.foo.bar.Wibble"/> <class name="org.foo.bar.Bobble"/> <class name="org.foo.bar.Tribble"/> </javah>
使用“旧”JNI 格式写入三个类的头文件,然后写入相应的 .c 存根。verbose 选项将导致 Javah
描述其进度。
<javah destdir="c" verbose="yes" old="yes" force="yes"> <class name="org.foo.bar.Wibble"/> <class name="org.foo.bar.Bobble"/> <class name="org.foo.bar.Tribble"/> </javah> <javah destdir="c" verbose="yes" stubs="yes" old="yes" force="yes"> <class name="org.foo.bar.Wibble"/> <class name="org.foo.bar.Bobble"/> <class name="org.foo.bar.Tribble"/> </javah>
如果您想使用自定义的 JavahAdapter
org.example.MyAdapter
,您可以使用 implementation 属性
<javah destdir="c" class="org.foo.bar.Wibble" implementation="org.example.MyAdapter"/>
或定义一个类型并将此嵌套到任务中,如
<componentdef classname="org.example.MyAdapter" name="myadapter"/> <javah destdir="c" class="org.foo.bar.Wibble"> <myadapter/> </javah>
在这种情况下,您的 javah
适配器可以支持其自身的属性和嵌套元素。