Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在IBMJ9JVM中使用JNA_Java_Jna_J9 - Fatal编程技术网

Java 在IBMJ9JVM中使用JNA

Java 在IBMJ9JVM中使用JNA,java,jna,j9,Java,Jna,J9,将JNA与J9一起使用的第一个困难是J9JVM不包括java.awt包,本机类从这个包中导入一些类。通过下载JNA源代码,剥离这些导入及其依赖方法(我无论如何都不使用),并构建一个新的JNA jar,可以很容易地克服这一问题 下面是一个简单的测试程序: public class TestJni { public static void main(String[] args) { CLibrary instance = (CLibrary) Nati

将JNA与J9一起使用的第一个困难是J9JVM不包括java.awt包,本机类从这个包中导入一些类。通过下载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)

我已经在j9上与JNA合作了几个月了。我在这里和那里有过一些小麻烦,但大多数情况下似乎都很顺利

首先,JNA的最新版本(3.2.7)似乎导入了awt。我使用的是3.2.4,awt导入被注释掉了。我想这对你来说是现成的


第二,我正在使用的J9版本是针对WinCE的,它是针对Java1.4的JVM。不过,最新的JNA是基于Java1.5构建的。因此,您可能需要检查j9版本所基于的java版本。我相信JNA3.2.4与Java1.4兼容

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

感谢您的回复。我昨天尝试使用System.load()直接加载temp jnaXXXXXX.dll,但在尝试访问java.nio.Buffer时失败。J9似乎没有包含NIO包。我认为JNA隐藏了这个错误,并抛出了不满意的链接错误。您也遇到过这个问题吗?是的,NIO已被排除在j9之外。如果您查看JNA中的本机代码,它实际上是调用System.Load来加载DLL。您完全正确。如果查看上面的堆栈跟踪,您会发现System.load()本身引用了NIO包!你是如何成功绕过这一点的?顺便说一句,关于回到JNA 3.2.4的建议很好——比起手动从3.2.7 jar中取出东西,我对它感到更舒服。我实际上没有观察到这一点,但NIO似乎造成了问题。解决这一问题似乎不是一个简单的方法。我从你那里得到消息来源。这是JNA的wince端口。作者已经注释掉了所有NIO和awt的内容。我想你可以试试。很好的发现。我可以看到这对WinCE是有效的,但在尝试在win32-x86上运行时,它仍然在同一条线上爆炸。我试图让JNA使用Sametime7.5.1中包含的J9JVM。我开始认为这是不可能的。我仍然会将这个答案标记为已被接受,因为我认为这对那些试图在Windows Mobile设备上完成同样任务的人来说将是非常有益的。。。说起来容易做起来难。主要是因为JNA确实需要缓冲区类。我不确定你的意思。JNA指的是java.nio.Buffer和java.awt,但是如果您在类路径中包含自己在JNA之前的(空)实现,那么一切都应该正常运行。
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)