![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
qpile |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
Как мне связать JAVA и имеющуюся у меня DLL , использую JNA? Во описание одной из функций моей DLL
Я пишу следующий код(библиотеку приложил):
Но вылазите ошибка :
|
||||||
|
|||||||
casey |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.12.2006 Где: Украина Репутация: 1 Всего: 2 |
Судя по ошибке функция не найдена, возможно тут мешает маскирование имен, попробуй прогнать, например, утилитой impdef длл-ку свою, узнаешь реальные имена функций.
А по поводу кода, мне кажется так надо:
Почитай на https://jna.dev.java.net/ про типы и использование типа long |
|||
|
||||
qpile |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
Такой вариант тоже не работает..Ошибка :
run: Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: Error looking up function 'TRANS2QUIK_CONNECT': Íå íàéäåíà óêàçàííàÿ ïðîöåäóðà. at com.sun.jna.Function.<init>(Function.java:179) at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:345) at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:325) at com.sun.jna.Library$Handler.invoke(Library.java:203) at $Proxy0.TRANS2QUIK_CONNECT(Unknown Source) at robot.Robot.jButton1ActionPerformed(Robot.java:100) at robot.Robot.access$000(Robot.java:8) at robot.Robot$1.actionPerformed(Robot.java:36) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2015) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2338) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253) at java.awt.Component.processMouseEvent(Component.java:6279) at javax.swing.JComponent.processMouseEvent(JComponent.java:3311) at java.awt.Component.processEvent(Component.java:6044) at java.awt.Container.processEvent(Container.java:2084) at java.awt.Component.dispatchEventImpl(Component.java:4639) at java.awt.Container.dispatchEventImpl(Container.java:2142) at java.awt.Component.dispatchEvent(Component.java:4465) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4664) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4327) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4257) at java.awt.Container.dispatchEventImpl(Container.java:2128) at java.awt.Window.dispatchEventImpl(Window.java:2612) at java.awt.Component.dispatchEvent(Component.java:4465) at java.awt.EventQueue.dispatchEvent(EventQueue.java:618) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:286) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:191) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:186) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:178) at java.awt.EventDispatchThread.run(EventDispatchThread.java:139) Я сомневаюсь что имя функции задано не правильно. Я скопипастил ее из мануала. |
|||
|
||||
casey |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.12.2006 Где: Украина Репутация: 1 Всего: 2 |
попробуй все таки имя
_TRANS2QUIK_CONNECT@16 |
|||
|
||||
qpile |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
когда задаешь это имя в интерфейсе JAVA на ошибку ругается
|
|||
|
||||
casey |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.12.2006 Где: Украина Репутация: 1 Всего: 2 |
Скачал я твою длл, PE Explorer и impdef в один голос говорят, что твоя функция имеет имя _TRANS2QUIK_CONNECT@16. Это типичное маскирование имен в Визуал С++. В документации к длл указывается имя TRANS2QUIK_CONNECT, там примеры есть под визуал с++ и с#, они поймут такое имя, так как визуал студия прозрачно применяет это маскирование.
Джава ругается на символ @ это понятно. |
|||
|
||||
qpile |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
Спасибо за помощь! Киньте телефон в личку..Денежку кину в подарочек (небольшой есс-но).
Ошибка теперь изменилась! Ноэто уже радует ![]() Exception in thread "AWT-EventQueue-0" java.lang.ClassFormatError: Duplicate field name&signature in class file robot/Robot$TransToQuik at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:764) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144) at java.net.URLClassLoader.defineClass(URLClassLoader.java:382) at java.net.URLClassLoader.access$100(URLClassLoader.java:75) at java.net.URLClassLoader$1.run(URLClassLoader.java:294) at java.net.URLClassLoader$1.run(URLClassLoader.java:288) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:287) at java.lang.ClassLoader.loadClass(ClassLoader.java:399) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:334) at java.lang.ClassLoader.loadClass(ClassLoader.java:332) at robot.Robot.jButton1ActionPerformed(Robot.java:99) at robot.Robot.access$000(Robot.java:8) at robot.Robot$1.actionPerformed(Robot.java:36) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2015) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2338) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253) at java.awt.Component.processMouseEvent(Component.java:6279) at javax.swing.JComponent.processMouseEvent(JComponent.java:3311) at java.awt.Component.processEvent(Component.java:6044) at java.awt.Container.processEvent(Container.java:2084) at java.awt.Component.dispatchEventImpl(Component.java:4639) at java.awt.Container.dispatchEventImpl(Container.java:2142) at java.awt.Component.dispatchEvent(Component.java:4465) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4664) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4327) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4257) at java.awt.Container.dispatchEventImpl(Container.java:2128) at java.awt.Window.dispatchEventImpl(Window.java:2612) at java.awt.Component.dispatchEvent(Component.java:4465) at java.awt.EventQueue.dispatchEvent(EventQueue.java:618) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:286) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:191) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:186) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:178) at java.awt.EventDispatchThread.run(EventDispatchThread.java:139) |
|||
|
||||
casey |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.12.2006 Где: Украина Репутация: 1 Всего: 2 |
Кинь сюда весь код, посмотреть...
|
|||
|
||||
qpile |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
|
|||
|
||||
qpile |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
||||
|
||||
casey |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 20.12.2006 Где: Украина Репутация: 1 Всего: 2 |
Ну что тут сказать. Я в джаве не спец, но по-моему вызвать функции содержащие знак @ через JNA не удасться. Как выход вижу:
1. самое нормальное решение - писать все на c/с++ и не морочить голову. Поясню почему: - ни о какой кроссплатформенности и речи быть не может - ты привязан к винде своей длл-кой (на фига тогда джава); - тебе придется использовать указатели (возможно и указатели на указатели) и нэйтив-типы - тут по-моему в джаве ваще туго будет; 2. Написать длл-обертку, экспортирующую функции без маскирования (как extern "C") и тогда можно использовать и JNI и JNA. |
|||
|
||||
qpile |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 12.8.2009 Репутация: нет Всего: нет |
Обертку можно написать с помощью
https://jna.dev.java.net/javadoc/com/sun/jn...tionMapper.html ...Но я не знаю как это использовать..ни одного примера Добавлено через 1 минуту и 10 секунд вот с помощью этого к библе подключился без проблем http://www.jinvoke.com/ Но она платная |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |