【发布时间】:2023-03-30 15:44:02
【问题描述】:
我有一个简单的 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)
我不得不改变很多东西。在使用 gcc 的 Ubuntu 上;它有效:
ghostrider@:~/programing/java/jni/HelloJNI$ java -Djava.library.path=. HelloWorld
Hello from C!
ghostrider@:~/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!
【问题讨论】:
-
javac使用哪些选项?java版本是否与您编译时的目标 VM 匹配? -
我只是使用了 javac HelloJNI.java,是的,VM 和 java 应该匹配。我在没有java的笔记本电脑上做这个。我刚刚安装了JDK并使用MinGw编译了c部分。
-
到你的新问题。您可以使用任何能够生成 Windows 二进制文件的编译器。 MinGW 是port of the GNU Compiler Collection (GCC), including C, C++, ADA and Fortran compilers。
标签: java c java-native-interface shared-libraries mingw