我们正在从JDK1.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>现在,missing javah错误消失了,但我在build目录中看不到生成的IO.h文件。有没有人能帮我,怎么做?真的很感谢你的帮助,谢谢。
注意:目录src/java/com/zimbra/znative大约有5-6个.java文件。我提到了一个仅针对1个文件的示例。
发布于 2020-01-14 21:07:58
我看不出有什么明显的方法可以说服javac任务这样做。nativeHeaderDir=生成头,但不会像您所发现的那样连接。
后javac的变通方法可能如下所示-使用Ant 任务将每个类的标头合并到一个文件中:
<concat destfile="IO.h">
<header>/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
</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生成的头文件相同。
发布于 2020-01-14 17:19:05
通过下面的更改,我能够创建头文件。但是生成的文件名是"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-07-15 12:27:19
使用ant中的javac任务生成头文件应该与生成的类文件一起使用。因此,如果对应的类文件已经可用,并且源文件没有变化(换句话说,您的编译类修改时间比java源文件更长),那么javac ant任务将不会对该类文件执行任何操作,包括生成本机头文件。
您必须执行一些检查,
srcdir属性,它指向启动包的正确目录。(例如如果您的类名是com.zimbra.znative.MyClass,文件路径是src/java/com/zimbra/znative/MyClass.java,那么您的srcdir应该指向将在其中生成已编译的类文件的src/java.destdir,否则它将在您的srcdir.srcdir中具有本机方法的所有头文件,则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}内部
https://stackoverflow.com/questions/59728471
复制相似问题