Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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

Но вообще зачем это нужно smile Такое проще на С++ или С# сделать...

Автор: ShkVal 31.1.2005, 11:25
Цитата(Domestic @ 31.1.2005, 11:03)
Ну вот например
http://www.microsoft.com/mind/0198/jdirect.asp

Но вообще зачем это нужно smile Такое проще на С++ или С# сделать...

Тут пример вроде для 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 примера, обычно я делаю так
Код


public class DynamicLoad
{
   static public void main (String args[])
       throws InstantiationException, IllegalAccessException
   {
       System.out.println ("DLL is not loaded yet.");

       System.out.println ("Let's find class (and load DLL)");
       try {
           Class c = Class.forName ("ClassFromDLL");

           System.out.println ("Class found (DLL is loaded successfully)");
           c.newInstance();
       } catch (ClassNotFoundException e) {
           System.out.println ("Class not found. Maybe DLL is absent?");
       }
   }
}



Код

public class forNameTest
{

static public void main (String args[])
 throws ClassNotFoundException, InstantiationException, IllegalAccessException
{
 System.out.println ("Let's find class compiled in a separate DLL and "+
                     "create its instance");

 Class.forName("samplePackage.dllClass").newInstance();
}

}


Код

public class ltDllTest
{
 static public void main (String args[])
 {
   dllClass.printSomething();
 }
}


PS Примеры взяты из Excelsior JET

Автор: ShkVal 31.1.2005, 13:21
chaos, что-то я ничего не понял

Автор: chaos 31.1.2005, 13:33
Цитата(ShkVal @ 31.1.2005, 13:21)
chaos, что-то я ничего не понял

Чето я напорол не того smile
Это пример написания 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
Цитата(ShkVal @ 31.1.2005, 16:20)
что-то я не понял из этого примера как можно воспользоваться методами dll-ки.

Ну ты пишешь свой 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
А как у тебя всё это проходит? Без укозания ключа или ещё чего-ниб smile smile
Народ кто знает как решить проблемму?

Автор: 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
Цитата(ShkVal @ 31.1.2005, 12:31)
Подскажите. Может кто вызывал методы из dll-файлов написанных на С++ из Java. Как это делается?

здесь была похожая тема - 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
Цитата(ShkVal @ 10.2.2005, 12:18)
Но при вызове уже native-метода в Java происходит exception такого рода java.lang.UnsatisfiedLinkError.

Проверь, что каталог в котором она находится прописан в PATH или она лежит в текущем каталоге.

Автор: ShkVal 11.2.2005, 10:23
LSD, Dll-ка подгружантся. При System.loadLibrary("JniTest") не вылетает, значит доступ к ней есть. Вылет же происходит уже при вызове функции из этой библиотеке. Такое ощущение что он не видит функции в dll.
Код

java.lang.UnsatisfiedLinkError: showString
at ucheba.JniTest.showString(Native Method)
at ucheba.JniMain.main(JniMain.java:13)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:78)
Exception in thread "main"

Может кто знает в чём проблемма?

Автор: ShkVal 11.2.2005, 15:51
Может я как-то непонятно изложил суть проблеммы? Если надо уточнения я поясню.
Не могу понять вроде всё правильно делаю smile smile

Автор: 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
Модератор: Пожалуйста, один топик - один вопрос.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)