【问题标题】:Using JNA with IBM J9 JVM将 JNA 与 IBM J9 JVM 一起使用
【发布时间】:2011-08-29 04:54:34
【问题描述】:

将 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)

【问题讨论】:

    标签: java jna j9


    【解决方案1】:

    我已经在 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 兼容。

    【讨论】:

    • 感谢您的回复。我昨天尝试使用 System.load() 直接加载临时 jn​​aXXXXXX.dll,但它在尝试访问 java.nio.Buffer 时崩溃了。 J9 似乎没有包含 NIO 包。我认为 JNA 隐藏了这个错误,并抛出了 UnsatisfiedLinkError。你也遇到过这个问题吗?
    • 是的 NIO 已从 j9 中排除。如果您查看 JNA 中的本机代码,它实际上是调用 System.Load 来加载 Dll。
    • 你是绝对正确的。如果您查看上面的堆栈跟踪,您会发现 System.load() 本身引用了 NIO 包!你是如何成功解决这个问题的?顺便说一句,关于回到 JNA 3.2.4 的好建议——我比手动从 3.2.7 jar 中取出东西更舒服。
    • 我实际上没有观察到这一点,但是 NIO 似乎引起了问题。似乎没有一个简单的方法可以解决这个问题。我从 java.net/jira/browse/JNA-108 获得了我的消息来源。这是 JNA 的 wince 端口。作者已经注释掉了所有 NIO 的东西和 awt 的东西。我想你可以试试。
    • 很棒的发现。我可以看到这适用于 WinCE,但在尝试在 win32-x86 上运行时它仍然会在同一条线上爆炸。我试图让 JNA 与 Sametime 7.5.1 中包含的 J9 JVM 一起工作。我开始认为这是不可能的。仍会将此答案标记为已接受,因为我认为这对尝试在 Windows Mobile 设备上完成相同任务的人们非常有益。
    【解决方案2】:

    您还可以简单地提供您自己的 java.nio/java.awt 东西的存根实现,并简单地避免使用这些功能(主要是直接缓冲区内容和获取本机窗口的句柄)。

    【讨论】:

    • 哦,相信我,我试过了……说起来容易做起来难。主要是因为 JNA 实际上确实需要 Buffer 类。
    • 我不确定你的意思。 JNA 指的是 java.nio.Buffer 和 java.awt,但是如果你在类路径中包含你自己的(空的)实现,在 JNA 之前,一切都应该运行得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2013-09-29
    • 2015-07-31
    相关资源
    最近更新 更多