2016-05-20 12 views
0

Ich habe ein einfaches JNI-Projekt, das kompiliert. Aber wenn ich es ausführe, bekomme ich den folgenden Fehler:Wie zu beheben JNI-Projekt, das nicht ausgeführt wird

Ich musste eine Menge Dinge ändern. Unter Ubuntu mit gcc; es funktioniert:

[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 

ich diesen link verwendet es zum Laufen zu bringen.

Also meine Frage ist jetzt kann ich gcc verwenden, um für eine Windows-Architektur zu kompilieren, oder muss ich MinGw installieren, um das zu tun? Danke für die Hilfe aller.

ich gerade bestätigt, dass dies mit mingw-64 arbeitet

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

Welche Optionen sind Sie für 'javac' mit? Entspricht die Java-Version der VM, auf die Sie beim Kompilieren ausgerichtet sind? – Michael

+0

Ich habe einfach javac HalloJNI.java verwendet, und ja die VM und Java sollten übereinstimmen. Ich mache das auf einem Laptop, der kein Java hat. Ich habe gerade JDK installiert und MinGw verwendet, um den c-Teil zu kompilieren. – user3326293

+0

Zu Ihrer neuen Frage. Sie können einen beliebigen Compiler verwenden, der Windows-Binärdateien erzeugen kann. MinGW ist ein [Port der GNU Compiler Collection (GCC), einschließlich C, C++, ADA und Fortran Compiler] (http://mingw.org/). – SubOptimal

Antwort

0

Ich glaube, Sie etwas falsch gemacht haben, wie die Klassenlader über eine gebrochene Klasse beschwert.

Folgende Schritte im Allgemeinen erforderlich sind (Sie haben uns gesagt, nicht, welche Sie tat)

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

Fix den Namen der Bibliothek in Ihrer Java-Klasse

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

Folgende Schritte eine gültige DLL erzeugen auf CentOS 7 (leider kein MinGW für Windows zur Hand)

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 

Kopieren Sie die HelloJNI.class und HelloJNI.dll in dasselbe Verzeichnis auf einer 64-Bit-Windows-Maschine.

java HelloJNI 

Ausgang

Hello World! 
+0

@ Suboptimal- Nun habe ich den Bibliotheksnamen geändert und erneut kompiliert. Ich denke, ich brauche Hilfe mit dem Java-Bibliothekspfad. Bitte beachten Sie die Ausgabe im Hauptteil des Posts. – user3326293

+0

Ich denke, ich habe das Problem gefunden. Meine Maschine ist eine 64-Bit-Maschine, und die Version von Java, die ich installiert habe, ist auch 64 Bit. Sollte ich vielleicht angeben, dass ich eine 64-Bit-DLL-Datei möchte, wenn ich gcc verwende? Ich habe gcc für andere c-Kompilationen benutzt, und ich konnte das Programm ausführen. – user3326293

+0

@ user3326293 Die von der JVM aufgerufene gemeinsam genutzte Bibliothek muss dieselbe Architektur haben. Sie können 64 Bit und 32 Bit nicht mischen. Sie müssen also angeben, dass Sie eine 64-Bit-DLL möchten. – SubOptimal