由于与此问题没有密切关系的原因,我坚持使用旧的RHEL / CentOS 5系统和Java 1.4(java version "1.4.2" gij (GNU libgcj) version 4.1.2 20080704 (Red Hat 4.1.2-44)
)。根据JNA文件,它应该工作。然而,由于它使用了Java 1.5的一个特性,即varargs
(void printf(String format, Object... args)
),因此提供的示例开始不顺利。所以我想我会尝试使用更简单的C库调用strerror
。
package ca...cl_client;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
public class MainJNA {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class);
Pointer strerror(int errno);
}
public static void main(String[] args) {
System.out.println("Hello, World");
System.out.println("err 22 : " + CLibrary.INSTANCE.strerror(22).getString(0)); //EINVAL
}
}
所以我在本地部署jna-master.zip
并将其连接起来:
$ sudo -- ln -s /home/user/Downloads/Java/jna-master/dist/jna.jar /usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre/lib/jna.jar
$ export CLASS_PATH=.:/home/user/Downloads/Java/jna-master/dist/jna.jar
编译好:
$ cd ~/Java
$ javac ./ca/gc/drdc_rddc/linux/utilinux/cl_client/MainJNA.java
但它不会运行:
$ java -cp $CLASS_PATH ca...cl_client.MainJNA
Hello, World
Exception in thread "main" java.lang.ClassFormatError: com.sun.jna.Library (unrecognized class file version)
at java.lang.VMClassLoader.defineClass(libgcj.so.7rh)
at java.lang.ClassLoader.defineClass(libgcj.so.7rh)
at java.security.SecureClassLoader.defineClass(libgcj.so.7rh)
at java.net.URLClassLoader.findClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at java.lang.VMClassLoader.defineClass(libgcj.so.7rh)
at java.lang.ClassLoader.defineClass(libgcj.so.7rh)
at java.security.SecureClassLoader.defineClass(libgcj.so.7rh)
at java.net.URLClassLoader.findClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at ca...cl_client.MainJNA.main(MainJNA.java:19)
使用javac -cp $CLASS_PATH ...
进行编译没有任何区别。
我在32位系统和64位系统(每个RHEL 5.3)上都试过这个,错误是一样的。
我做错了什么?
答案 0 :(得分:3)
1)。 我检查了官方JNA库类,结果如下:
在准确找到它时,你也会发现它: Switch to 1.6(在4.0版的发行说明中)。此外还有一个问题#109。所以你的上一个工作版本是3.5.2。
2.。)关于异国情调的Java版本,您可以阅读here。一些引用给你一些想法:
" gij还没有通过Sun兼容性测试,应该是 被认为是建立,测试等的独立平台。"
" GCJ不等同于Sun的JDK或JRE,所以你可能会发现 您需要的某些内容不包含在API中。
" gij非常古老,虽然我没有参考,但我怀疑它是不是 足够可靠以支持商业应用。"
正确地运行JNA在sun / oracle / open jdk中有时会非常棘手 - 所以这不是一项微不足道的任务......