|
|
|
JNI Delphi Bug ?
|
|||
|---|---|---|---|
|
#18+
Здрасте всем. Я столкнулся со странностями, так сказать, межъязыкового взаимодействия. А именно Java (1.6.02) и Delphi 6. Конечная цель -- подключение сишной dll к java. На delphi уже написан класс взаимодействия (обёртка) нужной dll. Я думал, что его можно немного доработать и спокойно использовать. Но не тут то было. По неизвестной причине функции dll нормально работающие в программе на delphi, перенесённые (почти без изменений) в обёртку для java вызывают ошибки jvm типа: # An unexpected error has been detected by Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x10004090, pid=3336, tid=2296 # # Java VM: Java HotSpot(TM) Client VM (1.6.0_02-b06 mixed mode, sharing) # Problematic frame: # C 0x10004090 # # An error report file with more information is saved as hs_err_pid3336.log # # If you would like to submit a bug report, please visit: # http://java.sun.com/webapps/bugreport/crash.jsp Причём со стопроцентной воспроизводимостью. Однако есть методы работабщие и не работающие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 14:33:07 |
|
||
|
JNI Delphi Bug ?
|
|||
|---|---|---|---|
|
#18+
1. Проверь параметры вызовов для delphi. Поищи аналог __cdecl __fastcall __thiscall и т.д. 2. проблемам может быть с frame для Exception ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 14:49:35 |
|
||
|
JNI Delphi Bug ?
|
|||
|---|---|---|---|
|
#18+
В описании функций, вроде, всё Ок, т.к. есть полностью рабочая функция и всё описано по стандарту (Java_<пакет_класс_метод>(PEnv: PJNIEnv;Obj: JObject). Меня беспокоит # Problematic frame: # C 0x10004090 Получается, что ошибку генерит С (ранее я сталкивался с такими ошибками при грязной работе с памятью). И на месте С была kernel32.dll или что-нибуть в этом роде. Или это не в ту степь? Может сишная dll плохо работает с памятью и делфя на это забивает, а java -- нет? А что означает "2. проблемам может быть с frame для Exception"? Приложение совсем не гуёвое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2007, 16:08:55 |
|
||
|
JNI Delphi Bug ?
|
|||
|---|---|---|---|
|
#18+
Проблема разрешилась странным образом. Я стал использовать динамическую загрузку библиотек вместо статической: function GetFRDllFunction(nm : string):TFarProc; var HInst : THandle; FPointer : TFarProc; begin HInst := LoadLibrary(dllPath); FPointer := GetProcAddress(HInst, PChar(nm)); Result := FPointer; end; а не function <имя>():integer; stdcall; external dllPath; Причина сего малопонятна, но следом появилась ещё проблема: функция полностью отрабатывает, но не возвращает результат (как будто вылетает). Однако работу программа завершает корректно. Может кто чего знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 11:24:33 |
|
||
|
JNI Delphi Bug ?
|
|||
|---|---|---|---|
|
#18+
rublicА что означает "2. проблемам может быть с frame для Exception"? Приложение совсем не гуёвое. # Problematic frame: # C 0x10004090 frame это не из гуя это способ организации в С++ или Delphi обработчика Exception. Т.е. если Delphi генерирует Exception то С++ его не поймает, такое возможно даже если dll и exe собраны разными версиями компиляторов (в пример gcc 3 и 4). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 16:32:29 |
|
||
|
JNI Delphi Bug ?
|
|||
|---|---|---|---|
|
#18+
rublicПроблема разрешилась странным образом. Я стал использовать динамическую загрузку библиотек вместо статической: function GetFRDllFunction(nm : string):TFarProc; var HInst : THandle; FPointer : TFarProc; begin HInst := LoadLibrary(dllPath); FPointer := GetProcAddress(HInst, PChar(nm)); Result := FPointer; end; а не function <имя>():integer; stdcall; external dllPath; Причина сего малопонятна, но следом появилась ещё проблема: функция полностью отрабатывает, но не возвращает результат (как будто вылетает). Однако работу программа завершает корректно. Может кто чего знает? Как описана TFarProc? Ты уверен что stdcall м? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 16:33:40 |
|
||
|
JNI Delphi Bug ?
|
|||
|---|---|---|---|
|
#18+
Всё, вроде заработало. TFarProc - обычный Pointer, ну а указывает он конечно же на переменную типа функция с stdcall. А проблемка с невозвратом параметра решилась просто: добрый человек, писавший сишную dll не указал парочку параметров в документации к функции. А я методом художественно-научного тыка часа за три всётаки смог это определить... Слава бозу не придётся писаить сокетный сервер на делфи для использования dll. JNI СПРАВИЛСЯ!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.08.2007, 21:04:43 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34724985&tid=2144919]: |
0ms |
get settings: |
20ms |
get forum list: |
23ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
53ms |
get topic data: |
17ms |
get forum data: |
4ms |
get page messages: |
78ms |
get tp. blocked users: |
3ms |
| others: | 337ms |
| total: | 547ms |

| 0 / 0 |
