java - 将 JNA 与 IBM J9 JVM 结合使用

标签 java jna j9

将 JNA 与 J9 一起使用的第一个困难是 J9 JVM 不包含 java.awt 包,并且 Native 类从该包中导入了几个类。这很容易通过下载 JNA 源代码、删除这些导入及其依赖方法(无论如何我都没有使用)并构建一个新的 JNA jar 来克服。

这是一个简单的测试程序:

    public class TestJni {
        public static void main(String[] args) {
            CLibrary instance = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);     
            instance.printf("Hello, World\n", new Object[] {});
        }

        // This is the standard, stable way of mapping, which supports extensive
        // customization and mapping of Java to native types.
        public interface CLibrary extends Library {        
            void printf(String format, Object[] args);
        }
    }

更正 java.awt 问题后,我收到错误:

Caused by: java.lang.UnsatisfiedLinkError: C:\DOCUME~1\TSO0112\LOCALS~1\Temp\jna72681.dll (Incompatible JNI version (not 1.1, 1.2 or 1.4))
at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:973)
at java.lang.System.load(System.java:459)
at com.sun.jna.Native.loadNativeLibraryFromJar(Native.java:696)
at com.sun.jna.Native.loadNativeLibrary(Native.java:620)
at com.sun.jna.Native.<clinit>(Native.java:104)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:187)
at TestJni.main(TestJni.java:8)

“不兼容的 JNI 版本”是什么意思?有没有人让 J9 与 JNA 配合得很好?

更新:我认为 JNA 在尝试加载 java.nio.Buffer 类时抑制了以下 NoClassDefFoundError,因为 J9 显然没有包含 NIO 包:

JNA: Problems loading core IDs: java.nio.Buffer
Exception in thread "main" java.lang.NoClassDefFoundError: java.nio.Buffer
    at java.lang.ClassLoader.loadLibraryWithPath(Native Method)
    at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:965)
    at java.lang.System.load(System.java:459)
    at TestJni.main(TestJni.java:8)

最佳答案

我已经在 j9 上与 JNA 合作几个月了。我在这里和那里遇到了一些小问题,但大多数事情似乎都运行良好。

首先 - 最新版本的 JNA(3.2.7) 似乎导入了 awt。我使用的是 3.2.4,awt 导入被注释掉了。我认为这对您来说是开箱即用的。

其次 - 我正在使用的 J9 版本适用于 WinCE,它是适用于 Java 1.4 的 JVM。最新的 JNA 虽然是基于 Java 1.5 构建的。所以你可能想检查你的 j9 版本是基于哪个版本的 java 构建的。我相信 JNA 3.2.4 与 java 1.4 兼容。

关于java - 将 JNA 与 IBM J9 JVM 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064562/

相关文章:

java - 使用 JNA 启动/停止服务

java - 在共享对象 dll 中创建的 JNA 空闲内存

Java - 读取现有进程的输出流

java - 使用 Attach API 连接到 J9VM

java - Vaadin - Micronaut 集成

java - @requestparam spring 始终为 null

java - Android '\' 特殊字符

c - JNA 映射到 C

java - 下载 IBM J9 JDK

java - 在 Java 中打印数组变量时获取随机措辞