java .lang.NoSuchFieldError: handle - PullRequest
       40

java .lang.NoSuchFieldError: handle

0 голосов
/ 10 февраля 2020

Недавно я столкнулся с проблемой с моим приложением Eclipse SWT GUI. Я пытался получить дескриптор окна со следующим кодом:

Display.getDefault().syncExec(()->{
            handle = Display.getDefault().getActiveShell().handle;
        });

отлично работал на моей 64-битной Windows 10 ОС.

Затем при развертывании того же приложения на 32-битной Windows машина (виртуальная машина, которую я настроил на своем p c, используя Hyper-v), я получаю следующую странную ошибку:

java.lang.NoSuchFieldError: handle

Документация для этого дескриптора говорит:

long org.eclipse.swt.widgets.Control.handle

дескриптор ресурса ОС (Предупреждение: это поле зависит от платформы)

ВАЖНО: Это поле не является частью SWTpubli c API. Он помечен как publi c только для того, чтобы его можно было> совместно использовать в пакетах, предоставляемых SWT. Он недоступен на всех платформах и никогда не должен быть доступен из кода приложения.

Может ли это быть причиной этой проблемы?

Если мы не можем использовать это свойство, каковы альтернативы? Я знаю, что JNI / JNA имеет дело с нативным кодом, насколько я знаю, они все еще полагаются на реализацию SWT.

Спасибо, что нашли время на мой вопрос!

Cheers!

1 Ответ

1 голос
/ 10 февраля 2020

Я бы подумал, что Javado c проясняет ситуацию. Внутренние компоненты SWT не должны использоваться, они совершенно разные на каждой платформе (которые могут включать 32/64-битные версии в одной и той же ОС), они могут даже меняться между выпусками.

32-битная версия Windows У SWT есть поле handle, но в 64-битной версии это int, а не long, что и дает вам эту ошибку. SWT для других платформ вообще не имеет поля handle.

Если вам действительно нужно получить доступ к чему-то подобному, вам придется написать код, указывающий c для каждой платформы / оконной системы / архитектуры. Для плагинов Eclipse это можно сделать с помощью фрагментов, указанных в платформе c. Я полагаю, что в этом конкретном случае вы могли бы также использовать отражение, чтобы искать как int, так и длинные поля 'handle'.

Также обратите внимание, что текущие версии Eclipse больше не поддерживают 32-разрядные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...