powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / JNI и Sydney 10.4.2
18 сообщений из 18, страница 1 из 1
JNI и Sydney 10.4.2
    #40127500
SergSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Есть рабочий проект x64 dll на Rio 10.3.3. В нем только одна функция, тело которой обернуто JVM.
Сторонний Java сервис x64 с этой функцией прекрасно работает.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function Java_ru_ExecuteReportPDF(PEnv: PJNIEnv; Obj: JObject;
  AServer, ADatabase, AUserName, APassword: JString;
  ALinkCode: JInt; AIdRecord: JLong): JInt; StdCall;
var
  JVM: TJNIEnv;
begin
  JVM:=TJNIEnv.Create(PEnv);
  Try

    ...
  Finally
    JVM.Free;
  end;
end;



Поставил Sydney 10.4.2. Собрал проект. Java сервис даже не стартует. Отладчик в нем пишет

OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
Exception in thread "main" java.lang.UnsatisfiedLinkError: моя_длл.dll: Произошел сбой в программе инициализации библиотеки динамической компоновки (DLL)
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:384)

Кто что может подсказать ?
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40127505
SergSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного добавлю инфы

Если в функции оставить только пустую обертку, то dll загружается динамически из Java

Код: pascal
1.
2.
3.
4.
5.
6.
  JVM:=TJNIEnv.Create(PEnv);
  Try
    Result:=0;
  Finally
    JVM.Free;
  end;



Но стоит только добавить пустой модуль данный все ломается в Сиднее. В Рио работает...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  JVM:=TJNIEnv.Create(PEnv);
  Try
    Result:=0;
    With TdmPDF.Create(Application) do
      Try
      Finally
        Free;
      end;
  Finally
    JVM.Free;
  end;
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40127517
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function Java_ru_ExecuteReportPDF(PEnv: PJNIEnv; Obj: JObject;
  AServer, ADatabase, AUserName, APassword: JString;
  ALinkCode: JInt; AIdRecord: JLong): JInt; StdCall;
var
  JVM: TJNIEnv;
begin
  try
    JVM:=TJNIEnv.Create(PEnv);
    Try
      Result:=0;
      With TdmPDF.Create(Application) do
        Try
        Finally
          Free;
        end;
    Finally
      JVM.Free;
    end;
  except
    on E: Exception do
      Result := -1;
  end;
end;



И что это за типы JObject, JString, JInt, JLong? Интерфейсы?

Вместо
Код: pascal
1.
TdmPDF.Create(Application)

попробовать
Код: pascal
1.
TdmPDF.Create(nil)
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40127520
SergSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,

JObject, JString, JInt, JLong - это типы из JNI.pas

type
// JNI Types
JBoolean = Boolean;
JChar = WideChar;
JShort = Smallint;
JFloat = Single;
JDouble = Double;
JSize = JInt;

Замена Application на nil не помогает. Самый прикол, что ошибка в Java происходит ДО вызова функции. Почему-то в Java не грузится сама dll.
Стоит выкинуть из функции

Код: pascal
1.
2.
3.
4.
5.
      With TdmPDF.Create(Application) do
        Try
        Finally
          Free;
        end;



dll чудесным образом начинает грузиться. Причем в Rio работал весь код. Просто бред какой-то...
М.б. Sydney использует какую-то системную dll, которая в Rio нахрен не нужна была...
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40127530
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LoadLibrary попробуй вызвать для своей dll из того места, где она лежит
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40127531
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может чего в манифесте DLL?
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40127533
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и костыль на всякий случай: сделай в 10.3.3 dll, которая уже будет вызывать DLL на 10.4.
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40127539
SergSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat,
Манифест - галка не стоит в настройках проекта.
Буду тестировать LoadLibrary для своей dll
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40127577
shalamyansky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по
SergSVK

Стоит выкинуть из функции dmPDF.Create, dll чудесным образом начинает грузиться

Ошибка при загрузке не "java".dll, а к "pdf".dll. Возможно, с путями к "pdf".dll связана. Какие-то версии "pdf".dll могут быть из-под Java не видны.
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128024
SergSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ничего не получилось в итоге. На Rio 10.3.3 dll грузится динамически в Java процесс, а на 10.4 нет.
Все происходит еще до вызова функции в этой dll.
Стоит из кода функции убрать динамическое создание модуля данных (даже пустого - без не визуальных компонентов) dll начинает грузиться в Java процесс. Замена модуля данных на форму рояли не играет. Что-то я очень сомневаюсь что виновата библиотека JNI...
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128035
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробовать отлаживать

1. Первым модулем в uses dpr добавляем модуль StopDebug.
2. Модуль StopDebug делаем таким
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
unit StopDebug;

interface

implementation

function MessageBoxW(AHandle: NativeUInt; AMesssage, ACaption: PWideChar; AFlags: Cardinal): Cardinal; stdcall; external 'User32.dll' name 'MessageBoxW';

initialization
  MessageBoxW('Pause1', nil, 0);
  MessageBoxW('Pause2', nil, 0);

end.


3. Компилируем с флагом Use debug dcu's
4. Запускаем Java процесс
5. Если появляется сообщение Pause1, то ставим брекпойнт на Pause2, делаем Attach to Process и цепляемся к Java процессу
6. После этого закрываем окно с Pause1 и начинаем нажимать F7 с обходом всех секций initialization и поиском проблемного места
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128043
istrebitel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Procmon'ом погляди может зависимости какие найти не может.
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128048
SergSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
Огромное спасибо ! Обе Pause работают. Java на компе у коллеги. Пока просто отключаю модули по одному и проверяю...
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128060
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSVK
Обе Pause работают.
Ну так тогда отлаживайтесь
_Vasilisk_
5. Если появляется сообщение Pause1, то ставим брекпойнт на Pause2, делаем Attach to Process и цепляемся к Java процессу
6. После этого закрываем окно с Pause1 и начинаем нажимать F7 с обходом всех секций initialization и поиском проблемного места
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128151
SergSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
Ситуация разрешилась быстрее чем я думал. Коллега быстро сваял тестовое java приложение TestApp.jar запускаемое через батник. Оно динамически грузит dll без вызова функции. Я так понимаю захостится к батнику нельзя. Но баг нашелся.

1. Дело не в компонентах доступа к данным SDAC и компонентах отчета. Они лежат в DataModule.
2. У меня в DataModule еще динамически создается свой объект. В одном из методов которого есть строчка
FGrid:=TDBGrid.Create(FForm). Этот объект используется во многих интерфейсных проектах, а не только в проекте с JNI.
Сам метод в проекте с JNI естественно не используется. Стоит закомментировать эту строчку - проблема исчезает и dll грузится.
3. В дельфовом модуле Vcl.DBGrids по сравнению с Rio добавлены модули Vcl.ImageCollection, Vcl.VirtualImageList.
Скорее всего дело в них... Не знаю поменялось ли что-то в D11. Как еще лучше проверить у меня нет идей...
Это к тому что бы разработчики делфей были в курсе...
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128155
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSVK
Я так понимаю захостится к батнику нельзя.
_Vasilisk_
цепляемся к Java процессу
Т.е. к java.exe
SergSVK
2. У меня в DataModule еще динамически создается свой объект. В одном из методов которого есть строчка FGrid:=TDBGrid.Create(FForm) . Этот объект используется во многих интерфейсных проектах
SergSVK
Стоит из кода функции убрать динамическое создание модуля данных ( даже пустого - без не визуальных компонентов )
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128338
SergSVK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_,
Большое спасибо за Ваши советы. Я приложил маленький тестовый проект. Если Вам или кому еще интересно можно попробовать запустить в D10.4 и D11.
1. 47 - строка вызывающая ошибку загрузки dll в java процесс. По умолчанию закомментирована. dll грузится
2. Убираем заглушку - не грузится в D10.4. В 10.3 Rio и XE8 грузится.
3. Тестовое java приложение - TestApp.bat
4. https://jdk.java.net/17/ - jdk.java что бы работало java приложение.
...
Рейтинг: 0 / 0
JNI и Sydney 10.4.2
    #40128400
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSVK
Если Вам или кому еще интересно можно попробовать запустить в D10.4 и D11.
У меня установлен только 10.3.1
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / JNI и Sydney 10.4.2
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]