| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Работа с dll на Java |
| Автор: ShkVal 31.1.2005, 10:59 |
| Подскажите можно ли на Java вызвать функции из dll. Если можно то подскажите как или где про это можно прочесть (желательно на русском, если нет на русском то ъоть что)? |
| Автор: Domestic Cat 31.1.2005, 11:03 |
| Ну вот например http://www.microsoft.com/mind/0198/jdirect.asp Но вообще зачем это нужно |
| Автор: ShkVal 31.1.2005, 11:25 | ||
Тут пример вроде для Microsoft-кой Java. Может кто-нибудь с этим сталкивался? Опишите вкратце что нужно сделать? |
| Автор: ShkVal 31.1.2005, 12:31 |
| Подскажите. Может кто вызывал методы из dll-файлов написанных на С++ из Java. Как это делается? |
| Автор: ZAVS 31.1.2005, 12:53 |
| насколько я помню это делается с помощью jni (Java native interface) посмотри в tutorial-e |
| Автор: chaos 31.1.2005, 13:09 | ||||||
Вот тебе 3 примера, обычно я делаю так
PS Примеры взяты из Excelsior JET |
| Автор: ShkVal 31.1.2005, 13:21 |
| chaos, что-то я ничего не понял |
| Автор: chaos 31.1.2005, 13:33 | ||
Чето я напорол не того Это пример написания dll и вызов на java, потом все это компилится в JET |
| Автор: AntonSaburov 31.1.2005, 14:10 |
| Можно сделать так: Написать JNI вызов своей процедуры, котоая уже будет звать нужную dll (так называемый враппер/wrapper) А вот и статейка с примером: http://vingrad.ru/JAVA-JAVA-001971 |
| Автор: ShkVal 31.1.2005, 16:20 |
| AntonSaburov, что-то я не понял из этого примера как можно воспользоваться методами dll-ки. Точнее как использовать JNI понятно. Может подскажите методы на С++, чтобы с помощью jni мне вызвать метод dll Может есть ещё какие-нибудь тулзы, чтобы решить эту задачу (вызвать функцию из dll написанную на С++) |
| Автор: AntonSaburov 1.2.2005, 11:40 | ||
Ну ты пишешь свой JNI метод для вызова его из JAVA. А из него уже никаких проблем не сосотавит вызвать ту DLL, которая тебе нужна. Т.е. сначала JAVA вызывает твою JNI dll, а эта dll уже может без каких-либо проблем вызвать стороннюю dll. |
| Автор: ShkVal 1.2.2005, 17:22 |
| AntonSaburov, cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD JniTest.cpp -FeJniTest.dll. Что это за прога и что-то у меня не запускается. Нашёл какой-то файл "C:\Program Files\Microsoft Visual Studio\VC98\Bin\CL.EXE", но не знаю то ли это что надо? |
| Автор: AntonSaburov 1.2.2005, 18:14 |
| Да, это именно то самое. Компилятор С++ от Майкрософт. Надо чтобы путь был прописан до него. Обычно при установке Студия спрашивает, прописать ли пути - лучше соглашаться. |
| Автор: ShkVal 1.2.2005, 18:33 |
| Я сделал как в примере всё написано выдаёт ошибку E:\Test>"C:\Program Files\Microsoft Visual Studio\VC98\Bin\CL.EXE" -I%JAVA_HOME% \include -I%JAVA_HOME%\include\win32 -LD JniTest.cpp -FeJniTest.dll Microsoft ® 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright © Microsoft Corp 1984-1998. All rights reserved. JniTest.cpp JniTest.h(2) : fatal error C1083: Cannot open include file: 'jni.h': No such file or directory Хотя всё лежит на месте jni.h лежит в C:\j2sdk1.4.2_05\include |
| Автор: AntonSaburov 1.2.2005, 18:52 |
| А переменная среды JAVA_HOME есть ? Я просто ее всегда прописываю. Если нет - то надо использовать полные пути до файлов. |
| Автор: ShkVal 1.2.2005, 19:01 |
| Я так уже и сделал только теперь другая проблемма E:\Test>"C:\Program Files\Microsoft Visual Studio\VC98\Bin\CL.EXE" -IC:\j2sdk1.4 .2_05\include -IC:\j2sdk1.4.2_05\include\win32 -LD e:\Test\JniTest.cpp -FeJniTes t.dll Microsoft ® 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86 Copyright © Microsoft Corp 1984-1998. All rights reserved. JniTest.cpp Microsoft ® Incremental Linker Version 6.00.8447 Copyright © Microsoft Corp 1992-1998. All rights reserved. /dll /implib:JniTest.lib /out:JniTest.dll JniTest.obj LINK : fatal error LNK1104: cannot open file "LIBCMT.lib" Где должен лежать этот файл или надо ещё, что-то укозать? Т е куда надо скопировать все требуемые либы (*.lib) или как указать к ним путь? |
| Автор: AntonSaburov 1.2.2005, 19:29 |
| Спроси это в форуме по Си - я честно говоря уже не помню. Есть там какой-то ключик. Посмотри в документации. |
| Автор: ShkVal 1.2.2005, 19:37 |
| А как у тебя всё это проходит? Без укозания ключа или ещё чего-ниб Народ кто знает как решить проблемму? |
| Автор: AntonSaburov 1.2.2005, 20:05 |
| У меня установлена переменная окружения LIB. Она у меня равна C:\Program Files\Microsoft Visual Studio\VC98\mfc\lib;C:\Program Files\Microsoft Visual Studio\VC98\lib Добавлено @ 20:07 Еще переменные Вот PATH: C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin Вот INCLUDE: C:\Program Files\Microsoft Visual Studio\VC98\atl\include;C:\Program Files\Microsoft Visual Studio\VC98\mfc\include;C:\Program Files\Microsoft Visual Studio\VC98\include Вот JAVA_HOME: C:\JAVA\SDK\j2sdk1.4.2_06 |
| Автор: Orange 2.2.2005, 12:23 | ||
здесь была похожая тема - http://forum.vingrad.ru/index.php?showtopic=35711&hl= |
| Автор: ShkVal 3.2.2005, 10:39 |
| Подскажите ещё пожалуйста! Как мне в native функции которая лежит в dll написанной на С++ сформировать объект Java например ArrayList, Map, String, чтобы после вызова этой функции она вернула то что мне надо и я дальше мог использовать то что вернула мне эта функция в своём Java-проекте. Т. е. как мне вернуть java-объект. Если не возможно, то что можно вернуть, чтобы с этим можно дальше работать в Java? |
| Автор: AntonSaburov 3.2.2005, 13:25 |
| В принципе можно вызвать JAVA из нативного метода. Посмотри ссылку в самом начале статьи. Там есть пример (уже сановский) как можно сделать обратную задачу - вызвать JAVA-код из обычного. Может стоить обратить внимание (может сейчас и не так)- когда-то давно я провозился очень долго, ничего не работало. В JDK есть две jvm.dll. Так вот возможно, что все будет работать только с той, которая лежит в каталоге client. А когда я возился - нужная jvm.dll лежала не в SDK, а в JRE. Пришлось пути править, чтобы правильную искала. Но вот по поводу создания и возвращения JAVA-объекта - я честно говоря не знаю. Не пробовал. Можешь попробовать сам и сообщить результаты - будет огромное СПАСИБО. |
| Автор: ShkVal 10.2.2005, 12:18 |
| Всё вроде сделал как надо. Библиотека (dll) подгружается Но при вызове уже native-метода в Java происходит exception такого рода java.lang.UnsatisfiedLinkError. Может кто подскажет из-за чего это может быть? |
| Автор: ShkVal 10.2.2005, 19:11 |
| Может из-за этого не работает? Я просмотрел свою Dll-ку Visual Studio тулзом DEPENDS и он выдал имя функции в dll в таком виде _Java_JniTest_showString@28 хотя в файле JniTest.cpp она задана как Java_JniTest_showString. Это так надо или тут что-то не то? |
| Автор: LSD 10.2.2005, 21:31 | ||
Проверь, что каталог в котором она находится прописан в PATH или она лежит в текущем каталоге. |
| Автор: ShkVal 11.2.2005, 10:23 | ||
LSD, Dll-ка подгружантся. При System.loadLibrary("JniTest") не вылетает, значит доступ к ней есть. Вылет же происходит уже при вызове функции из этой библиотеке. Такое ощущение что он не видит функции в dll.
Может кто знает в чём проблемма? |
| Автор: ShkVal 11.2.2005, 15:51 |
| Может я как-то непонятно изложил суть проблеммы? Если надо уточнения я поясню. Не могу понять вроде всё правильно делаю |
| Автор: LSD 12.2.2005, 12:52 |
| У тебя неправильный заголовочный файл. Для метода ucheba.JniTest.showString сишная функция должна быть Java_ucheba_JniTest_showString, а не Java_JniTest_showString как у тебя, т.е у тебя пропущенно имя пакета. |
| Автор: ShkVal 14.2.2005, 11:07 |
| LSD и AntonSaburov спасибо. Жалко, что я не могу поднять рейтинг. |
| Автор: ShkVal 21.3.2005, 20:36 |
| Может кто знает мне в dll написанную на C++ нужно передать юникод т.е. получить в моей dll-ке из jstring значение ввиде const unsigned short* и передать это в функцию другой dll-ки (той которую я юзаю) Как вытащить строку в юникоде? |
| Автор: ShkVal 23.3.2005, 18:19 |
| Подскажите пожалуйста! Как вернуть мне из сишной dll-ки больше 1 значения. Например как в С++ это делается через передачу укозателей или ссылок в параметры функции. Возможно ли так сделать чтобы передать в параметре какой-нибудь объект и в него записать значение, чтобы потом в Java взять его? Мне кажется что это делается через функции типа CallxxxxxxxMethod. Как это можно сделать? |
| Автор: Domestic Cat 23.3.2005, 18:40 |
| Модератор: Пожалуйста, один топик - один вопрос. |