Способы переноса 32-битного .dll, чтобы он работал в 64-битной ОС - PullRequest
5 голосов
/ 28 мая 2010

Итак, я использую JPIB для связи с устройствами GPIB в моей Java-программе. Тем не менее, я столкнулся с загадкой. Более новые системы построены на 64-битных ОС. Однако файл jpib.dll записан в 32-разрядной версии. Я не могу придумать какие-либо вызовы, которые нужно было бы сделать, которые действительно 64-битные.

Настоящая проблема здесь в том, что проект JPIB не обновлялся с сентября 2006 года. Я пытался отправить электронное письмо разработчику через SourceForge, но я не думаю, что мне это удастся.

Кто-нибудь знает какие-либо способы обойти это? Или знаете, как (и могли бы сказать мне, как) перекомпилировать .dll в соответствие AMD-64?

Ответы [ 3 ]

5 голосов
/ 28 мая 2010

Примечание: я понятия не имею, что такое JPIB и GPIB.

Если вы хотите использовать DLL как есть, вам нужно написать приложение, которое может динамически связывать эту DLL и связываться с вашим приложением через какой-то IPC.

Если вы хотите пересобрать эту DLL, вам нужно получить исходный код и все его зависимости и установить инструменты сборки. Это не должно быть слишком сложно, хотя, если вы устанавливаете MS Visual Studio, мне кажется, что для установки x64 требуется пара моментов. Это может зависеть от вашей платформы установки, хотя; если вы устанавливаете на x64, вероятно, он просто будет работать.

4 голосов
/ 28 мая 2010

32-разрядная виртуальная машина будет по-прежнему работать на 64-разрядной платформе AMD и платформах Intel EMT64.

Однако, если вы хотите использовать библиотеку в 64-битном процессе, вы можете использовать java, чтобы помочь вам. В решении используются 2 JVM - 32-разрядная и 64-разрядная, а 64-разрядная используется для размещения вашего основного приложения. 32-битная библиотека содержит библиотеку JPIB. Затем вы используете RMI для моста между ними. Более подробно:

  • библиотека JPIB имеет довольно маленький API. К сожалению, все реализовано как классы. Вы абстрагируете библиотеку, реализуя интерфейсы, имеющие те же сигнатуры методов, что и основные классы драйверов.
  • Реализуйте интерфейс, вызывая классы JPIB напрямую. Вы используете RMI для предоставления этого интерфейса через RMI из 32-разрядной JVM.
  • В вашей 64-битной JVM вы используете RMI для получения экземпляра интерфейса JPIB от 32-битной виртуальной машины. Теперь вы можете вызывать методы на этом интерфейсе, как если бы они были локальными, но они реализованы как удаленные вызовы 32-битной виртуальной машины для выполнения.
0 голосов
/ 28 мая 2010

Вы должны быть в состоянии написать 64-битную оболочку, которая преобразуется в 32-битную DLL, и заставить ваш код JNI вызывать 64-битную оболочку вместо 32-битной DLL. Thunking - довольно продвинутая и зависимая от платформы тема C / C ++.

...