Добрый день всем! Сегодня мы рассмотрим тему, как использовать методы 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.Файл .
Из этого класса нам понадобится: - Получить сам класс — Получить функцию удалить , а именно Имя и Дескриптор.
— Заполните аргумент для этой функции - Используй это.
Итак, давайте начнем.
Самая удобная утилита для разборки класса на проверки, на мой взгляд, — DirtyJOE. Кидаем туда класс File и ищем в методах нашу функцию.
Находим его Имя и Дескриптор.
Давайте перейдем в Delphi и создадим там такую функцию.
function JVM_DeleteFile(JNIEnv: PJNIenv; FilePath: String): Boolean;
Обратите внимание, что в DirtyJOE функция удаления возвращает логическое значение.
Здесь все просто: назовите функцию и объявите переменные.
Давайте объявим переменные, чтобы наш код работал: 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).
Что ж, тогда мы получим класс и метод удаления: FileClass:= jnienv^.
FindClass(jnienv, 'java/io/File'); Delete:= jnienv^.
GetMethodID(jnienv, FileClass, 'delete', '()Z');
И теперь очень важный этап.
Обратите внимание, что в Java-коде мы создаем новый объект новый файл и в Delphi нам нужно сделать то же самое: Init:= jnienv^.
GetMethodID(jnienv, FileClass, '<init>', '(Ljava/lang/String;)V'); FileObj:= jnienv^.
NewObjectA(jnienv, FileClass, Init, @Args);
И нам, по сути, просто нужно использовать сам метод удаления: jnienv^.
CallBooleanMethod(jnienv, FileObj, Delete)
Но, поскольку мы впервые заметили, что функция удаления возвращает логическое значение, давайте проверим, возвращаются ли 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 и как их использовать.
Это очень важный момент .
Теги: #java #jni #delphi
-
Как Я Ездил На Беспилотном Такси
19 Oct, 24