![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Подскажите можно ли на Java вызвать функции из dll. Если можно то подскажите как или где про это можно прочесть (желательно на русском, если нет на русском то ъоть что)?
|
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Ну вот например
http://www.microsoft.com/mind/0198/jdirect.asp Но вообще зачем это нужно -------------------- |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Тут пример вроде для Microsoft-кой Java. Может кто-нибудь с этим сталкивался? Опишите вкратце что нужно сделать? Это сообщение отредактировал(а) ShkVal - 31.1.2005, 11:30 |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Подскажите. Может кто вызывал методы из dll-файлов написанных на С++ из Java. Как это делается?
|
|||
|
||||
| ZAVS |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 121 Регистрация: 25.2.2004 Где: ЕРЕВАН Репутация: нет Всего: 1 |
насколько я помню это делается с помощью jni (Java native interface)
посмотри в tutorial-e --------------------
Учись студент доцентом станешь :) |
|||
|
||||
| chaos |
|
||||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 1 Всего: 44 |
Вот тебе 3 примера, обычно я делаю так
PS Примеры взяты из Excelsior JET Это сообщение отредактировал(а) chaos - 31.1.2005, 13:11 |
||||||
|
|||||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
chaos, что-то я ничего не понял
|
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 1 Всего: 44 |
Чето я напорол не того Это пример написания dll и вызов на java, потом все это компилится в JET |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Можно сделать так:
Написать JNI вызов своей процедуры, котоая уже будет звать нужную dll (так называемый враппер/wrapper) А вот и статейка с примером: Что такое JNI - простейший пример |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
AntonSaburov, что-то я не понял из этого примера как можно воспользоваться методами dll-ки. Точнее как использовать JNI понятно. Может подскажите методы на С++, чтобы с помощью jni мне вызвать метод dll
Может есть ещё какие-нибудь тулзы, чтобы решить эту задачу (вызвать функцию из dll написанную на С++) Это сообщение отредактировал(а) ShkVal - 31.1.2005, 19:04 |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Ну ты пишешь свой JNI метод для вызова его из JAVA. А из него уже никаких проблем не сосотавит вызвать ту DLL, которая тебе нужна. Т.е. сначала JAVA вызывает твою JNI dll, а эта dll уже может без каких-либо проблем вызвать стороннюю dll. |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
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 |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Да, это именно то самое. Компилятор С++ от Майкрософт. Надо чтобы путь был прописан до него. Обычно при установке Студия спрашивает, прописать ли пути - лучше соглашаться.
|
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Я сделал как в примере всё написано выдаёт ошибку
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 |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
А переменная среды JAVA_HOME есть ?
Я просто ее всегда прописываю. Если нет - то надо использовать полные пути до файлов. |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Я так уже и сделал только теперь другая проблемма
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) или как указать к ним путь? Это сообщение отредактировал(а) ShkVal - 1.2.2005, 19:09 |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Спроси это в форуме по Си - я честно говоря уже не помню. Есть там какой-то ключик. Посмотри в документации.
|
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
А как у тебя всё это проходит? Без укозания ключа или ещё чего-ниб
Народ кто знает как решить проблемму? |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
У меня установлена переменная окружения 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 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 6.9.2004 Где: Russia, Moscow Репутация: 4 Всего: 5 |
здесь была похожая тема - http://forum.vingrad.ru/index.php?showtopic=35711&hl= --------------------
Пару дней назад я познакомился с мальчиком...... |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Подскажите ещё пожалуйста!
Как мне в native функции которая лежит в dll написанной на С++ сформировать объект Java например ArrayList, Map, String, чтобы после вызова этой функции она вернула то что мне надо и я дальше мог использовать то что вернула мне эта функция в своём Java-проекте. Т. е. как мне вернуть java-объект. Если не возможно, то что можно вернуть, чтобы с этим можно дальше работать в Java? Это сообщение отредактировал(а) ShkVal - 3.2.2005, 10:49 |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
В принципе можно вызвать JAVA из нативного метода. Посмотри ссылку в самом начале статьи. Там есть пример (уже сановский) как можно сделать обратную задачу - вызвать JAVA-код из обычного.
Может стоить обратить внимание (может сейчас и не так)- когда-то давно я провозился очень долго, ничего не работало. В JDK есть две jvm.dll. Так вот возможно, что все будет работать только с той, которая лежит в каталоге client. А когда я возился - нужная jvm.dll лежала не в SDK, а в JRE. Пришлось пути править, чтобы правильную искала. Но вот по поводу создания и возвращения JAVA-объекта - я честно говоря не знаю. Не пробовал. Можешь попробовать сам и сообщить результаты - будет огромное СПАСИБО. |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Всё вроде сделал как надо.
Библиотека (dll) подгружается Но при вызове уже native-метода в Java происходит exception такого рода java.lang.UnsatisfiedLinkError. Может кто подскажет из-за чего это может быть? Это сообщение отредактировал(а) ShkVal - 10.2.2005, 12:27 |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Может из-за этого не работает?
Я просмотрел свою Dll-ку Visual Studio тулзом DEPENDS и он выдал имя функции в dll в таком виде _Java_JniTest_showString@28 хотя в файле JniTest.cpp она задана как Java_JniTest_showString. Это так надо или тут что-то не то? |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Проверь, что каталог в котором она находится прописан в PATH или она лежит в текущем каталоге. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
LSD, Dll-ка подгружантся. При System.loadLibrary("JniTest") не вылетает, значит доступ к ней есть. Вылет же происходит уже при вызове функции из этой библиотеке. Такое ощущение что он не видит функции в dll.
Может кто знает в чём проблемма? Это сообщение отредактировал(а) ShkVal - 11.2.2005, 13:51 |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Может я как-то непонятно изложил суть проблеммы? Если надо уточнения я поясню.
Не могу понять вроде всё правильно делаю |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
У тебя неправильный заголовочный файл. Для метода ucheba.JniTest.showString сишная функция должна быть Java_ucheba_JniTest_showString, а не Java_JniTest_showString как у тебя, т.е у тебя пропущенно имя пакета.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
LSD и AntonSaburov спасибо. Жалко, что я не могу поднять рейтинг.
|
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Может кто знает мне в dll написанную на C++ нужно передать юникод т.е. получить в моей dll-ке из jstring значение ввиде const unsigned short* и передать это в функцию другой dll-ки (той которую я юзаю)
Как вытащить строку в юникоде? Это сообщение отредактировал(а) ShkVal - 21.3.2005, 20:44 |
|||
|
||||
| ShkVal |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 10.11.2004 Репутация: нет Всего: 1 |
Подскажите пожалуйста!
Как вернуть мне из сишной dll-ки больше 1 значения. Например как в С++ это делается через передачу укозателей или ссылок в параметры функции. Возможно ли так сделать чтобы передать в параметре какой-нибудь объект и в него записать значение, чтобы потом в Java взять его? Мне кажется что это делается через функции типа CallxxxxxxxMethod. Как это можно сделать? |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Модератор: Пожалуйста, один топик - один вопрос.
-------------------- |
|||
|
||||
![]()
|
| Правила форума "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. |