3

J9 で JNA を使用する際の最初の問題は、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 バージョン」とはどういう意味ですか? JNAでうまくプレイするためにJ9を持っている人はいますか?

更新: J9 には明らかに NIO パッケージが含まれていないため、JNA は java.nio.Buffer クラスをロードしようとすると次の NoClassDefFoundError を抑制していると思います。

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

2 に答える 2

1

私はここ数か月間、j9でJNAを使用しています。あちこちでいくつかの小さな問題がありましたが、ほとんどの場合、問題なく動作しているようです。

最初 - JNA(3.2.7) の最新バージョンは awt をインポートしているようです。私は 3.2.4 を使用しており、awt インポートはコメントアウトされています。私はそれがあなたのために箱から出してうまくいくと思います.

2番目 - 私が使用しているJ9のバージョンはWinCE用で、Java 1.4用のJVMです。ただし、最新の JNA は Java 1.5 から構築されています。そのため、使用しているバージョンの j9 が構築されている Java のバージョンを確認することをお勧めします。JNA 3.2.4 は Java 1.4 と互換性があると思います。

于 2011-05-20T13:04:03.657 に答える
0

また、java.nio/java.awt の独自のスタブ実装を単純に提供し、それらの機能 (主にダイレクト バッファとネイティブ ウィンドウへのハンドルの取得) の使用を避けることもできます。

于 2011-07-01T12:26:03.100 に答える