2016-12-30 7 views
0

На данный момент я просто создаю простую программу, используя JNI, чтобы общаться и учиться. Я решил, что использование Ant для строительства сделает его намного проще. Вот моя структура проекта:Ant javah NullPointerException

src/pkg/Test.java 
bin/pkg/Test.class 
c/ 
build.xml 

Test.java:

package pkg; 

public class Test { 

    public static void main(String[] args) { 
     System.out.println(new Test().getInt()); 
    } 

    public native int getInt(); 

} 

build.xml:

<project name="Test" basedir="." default="main"> 
    <property name="src.dir" value="src"/> 
    <property name="bin.dir" value="bin"/> 

    <target name="clean"> 
     <delete dir="${bin.dir}"/> 
    </target> 

    <target name="compile" depends="clean"> 
     <mkdir dir="${bin.dir}"/> 
     <javac srcdir="${src.dir}" destdir="${bin.dir}" includeantruntime="false"/> 
    </target> 

    <target name="build-c" depends="compile"> 
     <javah outputFile="test.h" classpath="${bin.dir}" class="pkg.Test"/> 
    </target> 

    <target name="main" depends="build-c"/> 
</project> 

Исключение:

build-c: 
     [javah] Exception in thread "main" java.lang.NullPointerException 
     [javah] at com.sun.tools.javah.JavahTask.run(JavahTask.java:503) 
     [javah] at com.sun.tools.javah.JavahTask.run(JavahTask.java:329) 
     [javah] at com.sun.tools.javah.Main.main(Main.java:46) 

Я попытался отрываясь исключение онлайн и были 2 сообщения, которые я видел abo ut it (javah NullPointerException while using ANT in Eclipse Indigo & "Can't load javah" error in Eclipse). Я следовал за обоими советами. Я гарантировал, что JRE по умолчанию был JDK (jdk1.8.0_111), добавил tools.jar в записи домашнего мусора и изменил параметры запуска/отладки build.xml для работы в той же JRE, что и рабочая область. К сожалению, ни одна из этих вещей не помогла. Любая помощь будет принята с благодарностью, и если есть какая-либо другая информация, вам просто нужно сообщить мне.

+0

Вы не реализовали метод getInt. Это преднамеренно? – Rao

+0

@ Rao Да, это собственный метод, поэтому реализация будет в собственном коде (C/C++). – Stripies

ответ

0

Я нашел проблему. Несмотря на то, что я поменял его на использование JDK вместо JRE, он по-прежнему использовал JRE. Изменив конструктор Ant для проекта использовать отдельную JRE и выбрав JDK, он зафиксировал его.