#java #jna #j9
#java #jna #j9
Вопрос:
Первая трудность при использовании JNA с J9 заключается в том, что JVM J9 не включает пакет 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, Worldn", 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~1TSO0112LOCALS~1Tempjna72681.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)
Ответ №1:
Я работаю с 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.
Комментарии:
1. Спасибо за ответ. Я попытался загрузить временную jnaXXXXXX.dll непосредственно вчера с помощью System.load () и он взорвался при попытке доступа к java.nio.Buffer. Похоже, что в J9 не включен пакет NIO. Я думаю, что JNA скрывает эту ошибку и выдает UnsatisfiedLinkError. Вы тоже сталкивались с этой проблемой?
2. Да, NIO был исключен из j9. Если вы посмотрите на машинный код в JNA, это фактически вызов System. Загрузить, чтобы загрузить библиотеки DLL.
3. Вы абсолютно правы. Если вы посмотрите на приведенную выше трассировку стека, вы обнаружите, что System.load() сама ссылается на пакет NIO! Как вы успешно справляетесь с этим? Кстати, отличное предложение по возвращению к JNA 3.2.4 — мне это гораздо удобнее, чем копировать содержимое из jar 3.2.7 вручную.
4. На самом деле я этого не наблюдал, но да, NIO, похоже, вызывает проблемы. Кажется, что нет простого способа обойти это. Я получил свои исходники от java.net/jira/browse/JNA-108 . Это порт wince для JNA. Автор уже прокомментировал все материалы NIO и awt. Я думаю, вы могли бы попробовать это.
5. Отличная находка. Я вижу, что это работает для WinCE, но при попытке запуска на win32-x86 он по-прежнему выдает ошибку в той же строке. Я пытаюсь заставить JNA работать с JVM J9, включенной в Sametime 7.5.1. Я начинаю думать, что это невозможно. По-прежнему буду отмечать этот ответ как принятый, поскольку я думаю, что это будет очень полезно для людей, пытающихся выполнить то же самое на устройствах Windows Mobile.
Ответ №2:
Вы также можете просто предоставить свои собственные реализации-заглушки содержимого java.nio / java.awt и просто избежать использования этих функций (в основном, содержимого прямого буфера и получения дескриптора для собственного окна).
Комментарии:
1. О, поверьте мне, я пытался… легче сказать, чем сделать. В первую очередь потому, что JNA действительно нужен класс Buffer.
2. Я не уверен, что вы имеете в виду. JNA ссылается на java.nio.Buffer и java.awt, но если вы включите свои собственные (пустые) реализации, которые предшествуют JNA в classpath, все должно работать просто отлично.