Использование JNA с IBM J9 JVM - PullRequest
3 голосов
/ 20 мая 2011

Первая трудность в использовании JNA с J9 состоит в том, что JVM J9 не включает пакет java.awt, а класс Native импортирует несколько классов из этого пакета.Это легко преодолеть, загрузив исходный код JNA, вырвав импорт и зависимые от него методы (которые я в любом случае не использую), и создав новую флягу JNA.

Вот простая тестовая программа:

    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 подавляет следующий NoClassDefFoundError при попытке загрузить класс java.nio.Buffer, потому что 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)

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Я работаю с JNA на j9 уже пару месяцев.У меня было несколько мелких недоразумений, но в большинстве случаев все работает нормально.

Во-первых, последние версии JNA (3.2.7), похоже, импортируют awt.Я использую 3.2.4, и импорт AWT закомментирован.Я думаю, что это будет работать для вас из коробки.

Второе - версия J9, с которой я работаю, предназначена для WinCE, и это JVM для java 1.4.Последний JNA, хотя и построен на Java 1.5.Поэтому вы можете проверить, на какой версии java построена ваша версия j9.JNA 3.2.4 совместима с Java 1.4, я считаю.

0 голосов
/ 01 июля 2011

Вы также можете просто предоставить свои собственные реализации-заглушки для java.nio / java.awt и просто избегать использования этих функций (в основном, прямого буфера и получения дескриптора для собственного окна).

...