1

我们正在从 jdk 1.8 转移到 jdk13。在我们的 build.xml 我们有

<target name="generate-native-headers" depends="compile,resolve" description="Java to Native">
   <javah class="com.zimbra.znative.IO" outputfile="${build.dir}/IO.h" classpathref="build.class.path"/>
</target>

但是 java10+ 不再支持 javah 所以我发现我们可以在这里使用 javac "nativeheaderdir" 来实现这一点 - https://ant.apache.org/manual/Tasks/javac.html#nativeheaderdir

所以我尝试将上面的 javah 任务转换为 javac,如下所示

<target name="generate-native-headers" depends="compile,resolve" description="Java to Native">
    <javac srcdir="src/java/com/zimbra/znative" nativeHeaderDir="${build.dir}" classpathref="build.class.path" includes="src/java/com/zimbra/znative/IO.java"  />
</target>

现在丢失的 javah 错误消失了,但我没有看到在我的构建目录中生成 IO.h 文件。任何人都可以帮助我,如何做到这一点?非常感谢您的帮助,谢谢。

注意:目录 src/java/com/zimbra/znative 有大约 5-6 个 .java 文件。我只提到了 1 个文件的示例。

4

3 回答 3

1

我看不到说服 javac 任务这样做的明显方法。nativeHeaderDir=生成标题,但不会像您发现的那样连接。

<concat>post-javac 解决方法可能如下所示 - 使用 Ant任务将每个类的标头组合到一个文件中:

<concat destfile="IO.h">
  <header>/* DO NOT EDIT THIS FILE - it is machine generated */
#include &lt;jni.h&gt;
</header>
  <concat destfile="IO.h">
    <fileset dir="${build.dir}" includes="*.h" />
    <filterchain>
      <linecontainsregexp negate="true">
        <regexp pattern="(#include .jni.h.)|(DO NOT EDIT THIS FILE - it is machine generated)" />
      </linecontainsregexp>
    </filterchain>
  </concat>
</concat>

基本思路很简单:找到javac生成的所有头文件,拼接成一个需要名字的头文件。(可选)在此过程中,删除重复的#include 和注释行。结果应该与 JDK 8 javah 生成的标头相同。

于 2020-01-14T13:07:58.197 回答
0

使用 ant 中的 javac 任务生成头文件应该与您生成的类文件一起使用。因此,如果相应的类文件已经可用并且源文件中没有更改(换句话说,您编译的类修改时间高于 java 源文件),那么 javac ant 任务将不会对该类文件执行任何操作,包括本机头文件一代。

你必须执行一些检查,

  1. 您的srcdir属性是否指向启动您的包的正确目录。(例如,您的类名是com.zimbra.znative.MyClass,文件路径是,src/java/com/zimbra/znative/MyClass.java那么您srcdir应该指向src/java.
  2. 提供destdir编译的类文件将在哪里生成,否则它将在你的srcdir.
  3. 如果您想生成所有头文件,通常不需要包含所有类在您的本地方法srcdir
<target name="generate-native-headers" depends="compile,resolve" description="Java to Native">
    <javac srcdir="src/java" nativeHeaderDir="${build.dir}" destdir="${build.classes}"
      classpathref="build.class.path" includes="src/java/com/zimbra/znative/IO.java"  />
</target>

在运行 ant 之前,请确保该IO.class文件不存在或源 .java 文件比现有类文件具有最近的更改。然后看到它会生成类文件和头文件。头文件应该在里面${build.dir}

于 2020-07-15T04:27:19.087 回答
0

通过以下更改,我可以创建头文件。但生成的文件名为“com_zimbra_znative_IO.h”。它应该是“IO.h”

<target name="generate-native-headers" depends="compile,resolve" description="Java to Native">
        <javac srcdir="src/java/com/zimbra/znative" destdir="${build.dir}"  nativeHeaderDir="${build.dir}" classpathref="build.class.path"
               includes="IO.java"                                                                                                      
               excludes="Process.java,ProcessorUsage.java,ResourceUsage.java,Util.java,ProxyInfo.java" />
</target>
于 2020-01-14T09:19:05.477 回答