2016-05-20 2 views
0

私は単純なJNIプロジェクトをコンパイルしています。しかし、私はそれを実行すると、私は次のエラーが表示されます:実行されないJNIプロジェクトの修正方法

$ java HelloJNI 
Error: A JNI error has occurred, please check your installation and try again 
Exception in thread "main" java.lang.ClassFormatError: Extra bytes at the end of class file HelloJNI 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(Unknown Source) 
     at java.security.SecureClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.defineClass(Unknown Source) 
     at java.net.URLClassLoader.access$100(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.net.URLClassLoader$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(Unknown Source) 
     at java.lang.ClassLoader.loadClass(Unknown Source) 

私は多くのものを変更する必要がありました。 Ubuntuではgccを使用しています。それは動作します:

[email protected]:~/programing/java/jni/HelloJNI$ java -Djava.library.path=. HelloWorld 
Hello from C! 
[email protected]:~/programing/java/jni/HelloJNI$ ls 
ctest.c HelloWorld.class HelloWorld.h HelloWorld.java libctest.so 

私はこのlinkを使用して動作させました。

gccを使用してWindowsアーキテクチャ用にコンパイルすることができますか、それともMinGwをインストールする必要がありますか? 皆様のご協力ありがとうございます。

私はちょうどこれはMinGWの-64

C:\Users\sansari\Downloads\x86_64-w64-mingw32-gcc-4.8.0-win64_rubenvb\mingw64\java>gcc -o ctest.dll -shared -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" ctest.c -m64 

C:\Users\sansari\Downloads\x86_64-w64-mingw32-gcc-4.8.0-win64_rubenvb\mingw64\java>ls 
HelloWorld.class HelloWorld.h HelloWorld.java ctest.c ctest.dll 

C:\Users\sansari\Downloads\x86_64-w64-mingw32-gcc-4.8.0-win64_rubenvb\mingw64\java>java HelloWorld 
Hello from C! 
+1

? 'java'バージョンはコンパイル時にターゲットとするVMと一致しますか? – Michael

+0

私は単純にjavac HelloJNI.javaを使用しました。はい、VMとjavaは一致する必要があります。私は、Javaを持っていないラップトップでこれをやっています。 JDKをインストールし、MinGwを使用してCの部分をコンパイルしました。 – user3326293

+0

あなたの新しい質問に。 Windowsのバイナリを生成できるコンパイラを使用できます。 MinGWは[C、C++、ADA、Fortranコンパイラを含むGNUコンパイラ・コレクション(GCC)のポート](http://mingw.org/)です。 – SubOptimal

答えて

0

で動作することを検証し、私はクラスローダーが壊れクラス文句としてあなたが何か間違ったことをしたと信じています。

次の手順は、一般的に必要とされている

javac HelloJNI.java 
javah -jni HelloJNI 
# compile your HelloJNI.cpp 

instead of : System.loadLibrary("hello"); 
it should be: System.loadLibrary("HelloJNI"); 

次のステップは上の有効なDLLを生成するJavaクラスでライブラリの名前を修正しました。(あなたがやっている1私たちに語っていません) CentOS 7(手元にMinGWはありません)

javac HelloJNI.java 
javah HelloJNI 
x86_64-w64-mingw32-gcc -Wl,-kill-at -Wall -O0 -o HelloJNI.dll -shared \ 
    -I. -I/usr/lib/jvm/java-openjdk/include \ 
    -I/usr/lib/jvm/java-openjdk /include/linux HelloJNI.cpp 

HelloJNI.classおよびHelloJNI.dllを64ビットWindowsマシンの同じディレクトリにコピーします。

java HelloJNI 

あなたがjavac` `のオプションを使用している出力

Hello World! 
+0

@ Suboptimal-よくライブラリ名を変更して、もう一度コンパイルしました。私は、Javaライブラリのパスにいくつかの助けが必要だと思う。ポストの主要部分の出力に注意してください。 – user3326293

+0

私はこの問題を発見したかもしれないと思います。私のマシンは64ビットマシンで、インストールされているjavaのバージョンも64ビットです。おそらく、gccを使用するときに64ビットのdllファイルが必要だと指定する必要がありますか?私は他のcコンパイルにgccを使用しました。プログラムを実行することができました。 – user3326293

+0

@ user3326293 JVMによって呼び出される共有ライブラリは、同じアーキテクチャを持つ必要があります。 64bitと32bitを混在させることはできません。したがって、64ビットのDLLが必要だと指定する必要があります。 – SubOptimal

関連する問題