[Java, Delphi] JNI и Delphi. Использование Java методов при помощи JNI
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Всем доброго времени суток!
Сегодня мы рассмотрим такую тему, как использовать Java методы при помощи JNI.
На самом деле все очень просто. Давайте сразу начнем с примера:
Допустим у нас есть некое Java приложение на котором есть простая кнопка и при нажатии на эту кнопку будет исполняться некий код.
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
File MyFile = new File("D:\\Sample\\text.txt");
MyFile.delete();
}
Как мы видим в событии клика на кнопку будет исполняться просто код для удаления файла.
На Java все выглядит ясно и просто, но как же это будет выглядеть на Delphi с использованием JNI. На самом деле все проще чем кажется.
Для этого нам нужно разобрать заглянуть и в класс File, который находится по адресу java.io.File. Из этого класса нам нужно:
— Получиться сам класс
— Получить функцию delete, а именно Имя и Дескриптор.
— Заполнить аргумент для данной функции
— Использовать ее.
И так приступим.
Самой удобной утилитой для разборки класса на чечки на мой взгляд является DirtyJOE. КИдаем туда класс File и в методах ищем нашу функцию. Находим ее Имя и Дескриптор. Переходим в Delphi и создаем там такую функцию.
function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;
Обратим внимание в DirtyJOE что функция delete возвращает назад Boolean.
Тут все просто: Название функции и объявляем переменные.
Давайте объявим переменные для работы нашего кода:
var
FileClass: JClass;
Delete, Init: JMethodID;
FileObj: JObject;
Args: array[0..0] of JValue;
Это все то что далее мы будем искать и использовать.
Теперь давайте заполним Аргументы
Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath)));
Обратите внимание что JString мы передаем как JObject (По сути JString это и есть JObject)
Ну а далее мы будем получать класс и метод delete:
FileClass:= jnienv^.FindClass(jnienv, 'java/io/File');
Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z');
А теперь не мало важный этап. Обратите внимание что в Java коде мы создаем новый объект new File и в Delphi нам требуется сделать тоже самое:
Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V');
FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args);
И нам по сути осталось только использовать сам метод delete:
jnienv^.CallBooleanMethod(jnienv, FileObj, Delete)
Но, так как вначе всего мы обратили внимание что функция delete возвращает Boolean, то давайте же сделаем проверку на возврат True и False:
if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then
Result:= True
else
Result:= False;
Ну и давайте посмотрим на эту функцию в готовом виде:
function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;
var
FileClass: JClass;
Delete, Init: JMethodID;
FileObj: JObject;
Args: array[0..0] of JValue;
begin
Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath)));
FileClass:= jnienv^.FindClass(jnienv, 'java/io/File');
Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z');
Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V');
FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args);
if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then
Result:= True
else
Result:= False;
end;
Заключение.
На самом деле все проще чем кажется. С помощью JNI можно использовать любой Java метод. В этом примере, если вы внимательно смотрели то увидели что я использовал запись Аргументов типа JValue и как нужно их использовать. Это очень важный момент.
===========
Источник:
habr.com
===========
Похожие новости:
- [Разработка веб-сайтов, JavaScript, Java, VueJS] Знакомство с Vuecket
- [JavaScript, Node.JS, ReactJS, VueJS] Что, черт возьми, такое гидратация и регидратация? (перевод)
- [Разработка веб-сайтов, JavaScript, Программирование] JavaScript: 250+ практических вопроса (список + викторина + бонус)
- [Java] Ах, эти строки
- [Разработка веб-сайтов, JavaScript, Программирование] Webpack: руководство для начинающих (перевод)
- [Разработка веб-сайтов, JavaScript] Влияние service worker'ов на web-приложения
- [JavaScript, Java, Big Data, Data Engineering] В диких условиях. Итоги проектов Школы программистов в эпоху самоизоляции
- [Поисковые технологии, Программирование, Java, Разработка под e-commerce] Кому рецепты для электронной коммерции? Для SAP Commerce и не только
- [Разработка веб-сайтов, JavaScript, Node.JS] Архитектура современных корпоративных Node.js-приложений
- [Разработка веб-сайтов, JavaScript, Программирование] Политика общего происхождения и CORS: визуальное руководство (перевод)
Теги для поиска: #_java, #_delphi, #_jni, #_delphi, #_java, #_java, #_delphi
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 16:03
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Всем доброго времени суток! Сегодня мы рассмотрим такую тему, как использовать Java методы при помощи JNI. На самом деле все очень просто. Давайте сразу начнем с примера: Допустим у нас есть некое Java приложение на котором есть простая кнопка и при нажатии на эту кнопку будет исполняться некий код. private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
File MyFile = new File("D:\\Sample\\text.txt"); MyFile.delete(); } Как мы видим в событии клика на кнопку будет исполняться просто код для удаления файла. На Java все выглядит ясно и просто, но как же это будет выглядеть на Delphi с использованием JNI. На самом деле все проще чем кажется. Для этого нам нужно разобрать заглянуть и в класс File, который находится по адресу java.io.File. Из этого класса нам нужно: — Получиться сам класс — Получить функцию delete, а именно Имя и Дескриптор. — Заполнить аргумент для данной функции — Использовать ее. И так приступим. Самой удобной утилитой для разборки класса на чечки на мой взгляд является DirtyJOE. КИдаем туда класс File и в методах ищем нашу функцию. Находим ее Имя и Дескриптор. Переходим в Delphi и создаем там такую функцию. function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;
Обратим внимание в DirtyJOE что функция delete возвращает назад Boolean. Тут все просто: Название функции и объявляем переменные. Давайте объявим переменные для работы нашего кода: var
FileClass: JClass; Delete, Init: JMethodID; FileObj: JObject; Args: array[0..0] of JValue; Это все то что далее мы будем искать и использовать. Теперь давайте заполним Аргументы Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath)));
Обратите внимание что JString мы передаем как JObject (По сути JString это и есть JObject) Ну а далее мы будем получать класс и метод delete: FileClass:= jnienv^.FindClass(jnienv, 'java/io/File');
Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z'); А теперь не мало важный этап. Обратите внимание что в Java коде мы создаем новый объект new File и в Delphi нам требуется сделать тоже самое: Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V');
FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args); И нам по сути осталось только использовать сам метод delete: jnienv^.CallBooleanMethod(jnienv, FileObj, Delete)
Но, так как вначе всего мы обратили внимание что функция delete возвращает Boolean, то давайте же сделаем проверку на возврат True и False: if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then
Result:= True else Result:= False; Ну и давайте посмотрим на эту функцию в готовом виде: function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;
var FileClass: JClass; Delete, Init: JMethodID; FileObj: JObject; Args: array[0..0] of JValue; begin Args[0].l:= WideToJString(jnienv, PwideChar(WideString(FilePath))); FileClass:= jnienv^.FindClass(jnienv, 'java/io/File'); Delete:= jnienv^.GetMethodID(jnienv, FileClass, 'delete', '()Z'); Init:= jnienv^.GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V'); FileObj:= jnienv^.NewObjectA(jnienv, FileClass, Init, @Args); if jnienv^.CallBooleanMethod(jnienv, FileObj, Delete) = 1 then Result:= True else Result:= False; end; Заключение. На самом деле все проще чем кажется. С помощью JNI можно использовать любой Java метод. В этом примере, если вы внимательно смотрели то увидели что я использовал запись Аргументов типа JValue и как нужно их использовать. Это очень важный момент. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 16:03
Часовой пояс: UTC + 5