|
|
|
JNI
|
|||
|---|---|---|---|
|
#18+
Пытаюсь заюзать dll из JAVA. Следую инструкции в книге и на первом же шаге уткнулся в стену. На JAVA работал мало. Использую JDeveloper. Так вот создаю.... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. выдает Код: plaintext плюс ко всему Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2006, 16:37:50 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
JNIПытаюсь заюзать dll из JAVA. Как заюзать? Переформулируй вопрос что ты хочеш? А по поводу ошибки тебе явно сказанно что dll, нету в пути поиска dll. В доке описанно где JVM ищет по умолчанию и где её надо класть. И как добавить путь поиска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2006, 16:46:36 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Хочу в JAVA вызвать функцию dll, написанную на С++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2006, 16:56:59 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
А как узнать, где java.library.path ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2006, 17:23:08 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
полезная ссылка java.library.path - это путь к каталогу, где у тебя храниться твоя dll. это если указывать через опцию -Djava.library.path (см. ссылку выше) динамические библиотеки можно подключать из самого приложения: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. (см. ссылку выше.) Кроме того, имена функций в dll должны формироваться по определенному правилу(см. ссылку выше.) java.sun.com Dynamic linkers resolve entries based on their names. A native method name is concatenated from the following components: 1.the prefix Java_ 2.a mangled fully-qualified class name 3.an underscore (“_”) separator 4.a mangled method name 5.for overloaded native methods, two underscores (“__”) followed by the mangled argument signature The VM checks for a method name match for methods that reside in the native library. The VM looks first for the short name; that is, the name without the argument signature. It then looks for the long name, which is the name with the argument signature. Programmers need to use the long name only when a native method is overloaded with another native method. However, this is not a problem if the native method has the same name as a nonnative method. A nonnative method (a Java method) does not reside in the native library. In the following example, the native method g does not have to be linked using the long name because the other method g is not a native method, and thus is not in the native library. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 10:01:52 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
полезная ссылка java.library.path - это путь к каталогу, где у тебя храниться твоя dll. это если указывать через опцию -Djava.library.path (см. ссылку выше) динамические библиотеки можно подключать из самого приложения: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. (см. ссылку выше.) Кроме того, имена функций в dll должны формироваться по определенному правилу(см. ссылку выше.) java.sun.com Dynamic linkers resolve entries based on their names. A native method name is concatenated from the following components: 1.the prefix Java_ 2.a mangled fully-qualified class name 3.an underscore (“_”) separator 4.a mangled method name 5.for overloaded native methods, two underscores (“__”) followed by the mangled argument signature The VM checks for a method name match for methods that reside in the native library. The VM looks first for the short name; that is, the name without the argument signature. It then looks for the long name, which is the name with the argument signature. Programmers need to use the long name only when a native method is overloaded with another native method. However, this is not a problem if the native method has the same name as a nonnative method. A nonnative method (a Java method) does not reside in the native library. In the following example, the native method g does not have to be linked using the long name because the other method g is not a native method, and thus is not in the native library. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 10:04:55 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
И ещё одно я не понял, при чтении статей. У меня есть dll, но её разрабатывал не я и нет её исходников. Могу ли я её "прицепить" к java, если она писалась под Delphi и Си. Т.е требуются ли доработки в dll для использования в Java? Извиняюсь за утренний сумбур... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 11:03:23 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
JNIИ ещё одно я не понял, при чтении статей. У меня есть dll, но её разрабатывал не я и нет её исходников. Могу ли я её "прицепить" к java, если она писалась под Delphi и Си. Т.е требуются ли доработки в dll для использования в Java? Извиняюсь за утренний сумбур... Угу. Видно что чел, не читает присланные ему ссылки. Ты не можеш вызвать функцию из DLL эсли она не написанна для использвоания с java. В твоем случае MsgImpl.dll должна экспортировать метод Java_mypackage_ShowMessage_ShowMessage. Проверить ты это можеж используюя утилиту impdef которая создаст def для dll. Но скорее всего ты хочеш вызвать метод который экспортируется как _ShowMessage, этого сделать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 11:45:19 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Евгений Путилин JNIИ ещё одно я не понял, при чтении статей. У меня есть dll, но её разрабатывал не я и нет её исходников. Могу ли я её "прицепить" к java, если она писалась под Delphi и Си. Т.е требуются ли доработки в dll для использования в Java? Извиняюсь за утренний сумбур... Угу. Видно что чел, не читает присланные ему ссылки. Ты не можеш вызвать функцию из DLL эсли она не написанна для использвоания с java. В твоем случае MsgImpl.dll должна экспортировать метод Java_mypackage_ShowMessage_ShowMessage. Проверить ты это можеж используюя утилиту impdef которая создаст def для dll. Но скорее всего ты хочеш вызвать метод который экспортируется как _ShowMessage, этого сделать нельзя. Ссылку проситал, только хотел уточнить, а то у меня господа-товарищи говорят, что в java можно использовать любую dll, написанную для использования в С и Delphi ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 11:56:35 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Евгений Путилин Ты не можеш вызвать функцию из DLL эсли она не написанна для использвоания с java. В твоем случае MsgImpl.dll должна экспортировать метод Java_mypackage_ShowMessage_ShowMessage. Проверить ты это можеж используюя утилиту impdef которая создаст def для dll. но никто не мешает написать свой враппер в виде DLL, оформленой соовтетствующим образом, и вызывать уже его методы. Это, конечно, скажется на производительности. Пример из книжки: Код из *.h файла Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Java класс, использующий dll Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код враппера вызывающего функцию из целевой dll. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 12:18:15 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Т.е., для того, чтобы использовать мою dll в JAVA, можно обойтись без исходников dll, а только написать врапер ? Т.е достатлчно MYDLL.H? Сорри - перевожу аглицкий очень долго. Изучал немецкий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 12:37:45 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
JNIТ.е., для того, чтобы использовать мою dll в JAVA, можно обойтись без исходников dll, а только написать врапер ? Т.е достатлчно MYDLL.H? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2006, 12:43:53 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Столкнулся с двумя проблемами: 1. Использование Dll в Java 2. Никогда не писал dll, тем более в Си. НА изучение уйдет много времени. Поэтому не примите за дерзость, прошу помощи в виде наставлений. Я не прошу написания кода, помогите просто подсказками. Может в результате получится какое нибудь руководство по использованию dll в Java. ДЛЯ ЧАЙНИКОВ. Итак. У меня есть dll. И два файла *.h. В первом список функций из dll, а другой состоит из конструкций типа Код: plaintext Теперь пытаюсь делать обвязку своей dll. Т.е. создам dll для Java, которая будет вызывать функции первой dll. В Вorland С++ Builder 6 Код: plaintext Source Type -> C++ , а со всех остальный пунктов снимаю "галочки" (USE VCL, USE CLX, Multi Threaded, VC++ Style DLL) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 11:54:14 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Timm тынц Да я уже это читал и на русском, у меня опыт мал. Мне бы на примерах. Вот мой *.h (урезан) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Попытаюсь "собрать" враппер. Посмотрите, правильно ли я сделал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 12:32:42 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Последнюю функцию недописал Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 12:34:26 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Есть здесь правда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 13:03:08 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
JNIЕсть здесь правда Пока писал пример вы уже почти разобрались :) То, что бросилось в глаза: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Как вы собрираетесть из java передавать эту структуру в WriteCard(unsigned char* Data, TUID &UID, unsigned char Pam, unsigned char KSet); ? Для нее надо бы заводить отдельный класс c native методами для доступа к полям и хранить в нем указатель на native структуру. Тогда при передаче экземпляра этого класса в native метод в качестве параметра сможете получить указатель на структуру и передать его в качестве параметра в нужную функцию. Второе. SearchDevices(AnsiString* DeviceName, int &DeviceCount); возвращает, как я понимаю, код ошибки. В DeviceName она записывает список девайсов, а в DeviceCount - количество девайсов. В java примитивный тип int передается по значению. Так что Java_Win32_SearchDevices(jstring DeviceName, jint DeviceCount) изменит копию DeviceCount. И реального значения Вы не получите(могу. конечно, ошибиться). Кроме того, AnsiString* DeviceName, по идее должен бы быть jobjectArray (String[] в java классе) а не jstring как у Вас. Вообще, лучше завести отдельный класс для возвращаемого этой функцией результата и привести ее к виду вроде DeviceList SearchDevices(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 13:44:22 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
Спасибо за поддержку. Но чем больше читаю документации, тем больше путаюсь. Все таки, когда ж использовать javah? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 13:49:41 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
JNIВсе таки, когда ж использовать javah? javah это утилита, которая входит в jdk. Вещь для облегчения нашей жизни. Вот у нас есть java класс. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. мы запускаем javac Native.java javah Native и получаем то, о чем мы с Вами говорим - Native.h: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. Теперь имплементим его в нашей dll, и все счастливы :) Если у нас будет не 3 функции а 300... Результат понятен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 14:00:13 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
foo[quot JNI] Результат понятен. Понятен, только пытаюсь сам так сделать (в Java написать этот класс) и не получается. Показывает ошибки. В JDeveloper создаю новый Application, новый Project , затем новый JAVA Class вставляю твой пример и ругается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 14:35:55 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
JNI вставляю твой пример и ругается И что говорит? У меня в eclipse не ругается. Попробуй из командной строки скомпилировать. Может говорит что package не тот? А файлик правильно обозвал? (Он должен назаваться Native.java). А может ему слово Native не нравиться(вроде как ключевое слова языка, хотя java регистр различает)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 15:00:21 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
foo JNI вставляю твой пример и ругается И что говорит? У меня в eclipse не ругается. Попробуй из командной строки скомпилировать. Может говорит что package не тот? А файлик правильно обозвал? (Он должен назаваться Native.java). А может ему слово Native не нравиться(вроде как ключевое слова языка, хотя java регистр различает)? С этим тоже разобрался. Наклепал Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Скопировал полученный Native.class в D:\Native\Native.class Запускаю в командной строке javac -jni в D:\Native\Native.class ?, а в ответ, что javac не является внутренней командой. Буду с этим разбираться, но уж точно, что я сегодня по крупному торможу. Спасибо foo за поддержку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 15:09:32 |
|
||
|
JNI
|
|||
|---|---|---|---|
|
#18+
JNIСпасибо foo за поддержку Да не за что :). У нас тут не форум а чат получился :) JNIjavac -jni в D:\Native\Native.class javac - это компилятор java. Надо не javac -jni, а javah -jni .class НЕ НУЖНО! если запускать в D:\Native\ надо javah -jni Native -jni - нужен в java 1.4, а в 1.5 - эта опция включена по умолчанию. Что бы не получать сообщения о том, что javac не является внутренней командой надо запускать windows: %JAVA_HOME%\bin\java %JAVA_HOME%\bin\javac %JAVA_HOME%\bin\javah %JAVA_HOME%\bin\остальные_утилиты_jdk *nix: $JAVA_HOME\bin\java $JAVA_HOME\bin\javac $JAVA_HOME\bin\javah $JAVA_HOME\bin\остальные_утилиты_jdk где %JAVA_HOME%($JAVA_HOME) - переменная окружения хранящая путь к коревому каталогу jdk. т.е. в твоем случае %JAVA_HOME%\bin\javah -jni Native ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2006, 15:24:57 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34019247&tid=2147964]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
457ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 247ms |
| total: | 799ms |

| 0 / 0 |
