java - 让 JNA 在 Java 1.4 下工作

标签 java c jna rhel5

由于与这个问题无关的原因,我坚持使用带有 Java 1.4 的旧 RHEL/CentOS 5 系统(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)上都试过了,错误是一样的。

我做错了什么?

最佳答案

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 hasn't passed the Sun compatability test, and should be considered a separate platform for building, testing etc."

"GCJ is not equivalent to Sun's JDK or JRE, so you may find that certain things you need aren't included in the API.

"gij is very ancient, and while I don't have references I doubt it's reliable enough to support commercial applications."

在 sun/oracle/open jdk 中正确运行 JNA 有时非常棘手 - 所以这不是一项简单的任务...

关于java - 让 JNA 在 Java 1.4 下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294316/

相关文章:

java - 如何在没有托管 ZPL 打印机的情况下将 ZPL 命令转换为图像

objective-c - 错误: Implicit declaration of function

c - 如何更改 char* 指向的值?

java - 如何将 JNA + native 库与 JNLP Web 启动一起使用 [在 Mac 上]?

java - 如何使用 JNI 或 JNA 读取窗口标题?

java - 访问 JNA 指针的对等值

java - Spring 批处理 : How to create a Composite Item Writer?

java - 将给定日期转换为通用日期格式?

java - selenium 等待代理页面加载超时

c - 多行C宏