Apache Ant Javah задача не работает с JDK 10+ - PullRequest
1 голос
/ 14 января 2020

Мы переходим от jdk 1.8 к jdk13. В нашей сборке. 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 файла.

Ответы [ 2 ]

1 голос
/ 14 января 2020

Я не вижу очевидного способа убедить задачу javac сделать это. nativeHeaderDir= генерирует заголовки, но не объединяет, как вы нашли.

Обход после javac может выглядеть следующим образом - объедините заголовки для класса в один файл, используя Ant <concat> task:

<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>

Основная идея c проста: найти все файлы заголовков, сгенерированные javac, объединить их в один заголовок с имя требуется. При желании можно удалить повторяющиеся строки #include и comment. Результат должен выглядеть так же, как и заголовок JDK 8, созданный javah.

0 голосов
/ 14 января 2020

С этими изменениями я могу создавать заголовочные файлы. Но сгенерированное имя файла "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>
...