Jni И Делфи. Использование Методов Java С Jni

Добрый день всем! Сегодня мы рассмотрим тему, как использовать методы 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

Вместе с данным постом часто просматривают: