Javah

描述

从 Java 类生成 JNI 头文件。

当此任务执行时,它将生成实现本机方法所需的 C 头文件和源文件。

如果您使用的是 Java 8 或更高版本,请考虑使用 javacnativeheaderdir 属性,它允许您在单个步骤中编译类并生成本机头文件。

注意javah 在 Java 9 中已弃用,并在 Java 10 中删除。尝试在 Java 10 中使用它将失败。

可以使用不同的编译器。这可以通过 implementation 属性或嵌套元素进行选择。以下是属性的选择

注意:如果您使用此任务处理多个文件,则某些操作系统上的命令行可能会过长。不幸的是,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

您可以使用嵌套的 <arg> 元素为编译器指定其他命令行参数。这些元素的指定方式与 命令行参数 相同,但有一个额外的属性可用于仅在使用给定编译器实现时启用参数。

属性 描述 必需
value 参见 命令行参数 这些之一
line
file
path
prefix 参见 命令行参数自 Ant 1.8 起
suffix
implementation 仅在所选编译器实现与该属性的值匹配时才传递指定的参数。合法值与上面 列表 中的有效编译器相同。)

implementationclasspath

自 Ant 1.8.0 起

一个 类似路径的结构,它保存加载编译器实现时要使用的类路径,如果指定了自定义类。在使用内置编译器之一时没有影响。

任何实现 JavahAdapter 的类型嵌套元素

自 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 适配器可以支持其自身的属性和嵌套元素。