首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache javah任务不适用于jdk 10+

Apache javah任务不适用于jdk 10+
EN

Stack Overflow用户
提问于 2020-01-14 14:22:26
回答 3查看 592关注 0票数 1

我们正在从JDK1.8迁移到jdk13。在我们的build.xml中我们有

代码语言:javascript
复制
<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,如下所示

代码语言:javascript
复制
<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>

现在,missing javah错误消失了,但我在build目录中看不到生成的IO.h文件。有没有人能帮我,怎么做?真的很感谢你的帮助,谢谢。

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

EN

回答 3

Stack Overflow用户

发布于 2020-01-14 21:07:58

我看不出有什么明显的方法可以说服javac任务这样做。nativeHeaderDir=生成头,但不会像您所发现的那样连接。

后javac的变通方法可能如下所示-使用Ant 任务将每个类的标头合并到一个文件中:

代码语言:javascript
复制
<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和注释行。结果看起来应该与JDK8javah生成的头文件相同。

票数 1
EN

Stack Overflow用户

发布于 2020-01-14 17:19:05

通过下面的更改,我能够创建头文件。但是生成的文件名是"com_zimbra_znative_IO.h“。应该是"IO.h“

代码语言:javascript
复制
<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>
票数 0
EN

Stack Overflow用户

发布于 2020-07-15 12:27:19

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

您必须执行一些检查,

  1. 是您的srcdir属性,它指向启动包的正确目录。(例如如果您的类名是com.zimbra.znative.MyClass,文件路径是src/java/com/zimbra/znative/MyClass.java,那么您的srcdir应该指向将在其中生成已编译的类文件的src/java.
  2. Provide destdir,否则它将在您的srcdir.
  3. Normally内部生成包含如果您想要生成所有类在srcdir

中具有本机方法的所有头文件,则srcdir不是必需的

代码语言:javascript
复制
<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}内部

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59728471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档