让JNA在Java 1.4下工作

时间:2017-05-31 20:42:48

标签: java c jna rhel5

由于与此问题没有密切关系的原因,我坚持使用旧的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的一个特性,即varargsvoid 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)上都试过这个,错误是一样的。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

1)。 我检查了官方JNA库类,结果如下:

  • JNA 4.0.0 - >用1.6编译
  • JNA 3.5.0 - >用1.4编译
  • JNA 3.5.2 - >用1.4编译

在准确找到它时,你也会发现它: 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中有时会非常棘手 - 所以这不是一项微不足道的任务......