Доступ к Java jar из Delphi

есть двоичная библиотека Java jar с описанными классами / функциями, делающими некоторые полезные вещи (ничего особенного просто Java - нет JNI). Нет доступных источников.

есть задача вызвать эти функции непосредственно из Delphi. Как это сделать?

P. S. Я ничего не знаю о Делфи, но я много знаю о Java.

4 ответов


нет, вы не можете пойти по пути JNI, у.

несколько ресурсов:

Если у вас нет слишком много времени на руках, в котором вы можете распаковать файлы JAR (они являются ZIP-файлами), напишите свою собственную Java VM в Delphi и идите оттуда; -)


содержит ли файл jar основной класс, который можно вызвать из командной строки? Если проблема решена, Delphi может выполнять операции командной строки. Если нет основного класса, вы можете создать тот, который вызывает исходный файл jar.


как быстрая и простая альтернатива низкоуровневому, трудоемкому и подверженному ошибкам JNI от опции Delphi, вы должны попробовать Java для Delphi.

вы будете работать с объектно-ориентированным API, потребуется часть кода по сравнению с JNI и решить проблему интеграции Delphi/Java в течение нескольких часов вместо дней, недель (или месяцев в зависимости от варианта использования).

в качестве примера ниже приведено публичное объявление типа Delphi связанных с Java.ленг.Строка с извлечением кода, показывающая, как ее можно использовать.

Не стесняйтесь обращаться к J4SOFT, буду рад помочь вам.

Procedure Sample;
var
  AJavaString: Ijava_lang_String;
  AValue: string;
begin
  AJavaString := Tjava_lang_String.Create('A value'); 
  AValue :=  AjavaString.ToString;
  if AJavaString.StartsWith('A') then
  ...
end;

...
type
  Tjava_lang_String = class(Tjava_lang_Object, Ijava_lang_String)
  public
    constructor Create;
    constructor Create(p0: string);
    constructor Create(p0: Ijava_lang_StringBuffer);
    constructor Create(p0: Ijava_lang_StringBuilder);
    constructor Create(p0: TjxByte1DArray);
    constructor Create(p0: TjxByte1DArray; p1: Longint);
    constructor Create(p0: TjxByte1DArray; p1: Longint; p2: Longint);
    constructor Create(p0: TjxByte1DArray; p1: Longint; p2: Longint; p3: Longint);
    constructor Create(p0: TjxByte1DArray; p1: Longint; p2: Longint; p3: string);
    constructor Create(p0: TjxByte1DArray; p1: string);
    constructor Create(p0: TjxChar1DArray);
    constructor Create(p0: TjxChar1DArray; p1: Longint; p2: Longint);
    constructor Create(p0: TjxInt1DArray; p1: Longint; p2: Longint);
    function CharAt(p0: Longint): Char;
    function CodePointAt(p0: Longint): Longint;
    function CodePointBefore(p0: Longint): Longint;
    function CodePointCount(p0: Longint; p1: Longint): Longint;
    function CompareTo(p0: string): Longint;
    function CompareToIgnoreCase(p0: string): Longint;
    function Concat(p0: string): string;
    function ContentEquals(p0: Ijava_lang_StringBuffer): Boolean;
    class function CopyValueOf(p0: TjxChar1DArray): string;
    class function CopyValueOf(p0: TjxChar1DArray; p1: Longint; p2: Longint): string;
    function EndsWith(p0: string): Boolean;
    function Equals(p0: Ijava_lang_Object): Boolean; reintroduce;
    function EqualsIgnoreCase(p0: string): Boolean;
    class function Format(p0: string; p1: Tjava_lang_Object1DArray): string;
    function GetBytes: TjxByte1DArray;
    procedure GetBytes(p0: Longint; p1: Longint; p2: TjxByte1DArray; p3: Longint);
    function GetBytes(p0: string): TjxByte1DArray;
    procedure GetChars(p0: Longint; p1: Longint; p2: TjxChar1DArray; p3: Longint);
    function HashCode: Longint;
    function IndexOf(p0: Longint): Longint;
    function IndexOf(p0: Longint; p1: Longint): Longint;
    function IndexOf(p0: string): Longint;
    function IndexOf(p0: string; p1: Longint): Longint;
    function Intern: string;
    function IsEmpty: Boolean;
    function LastIndexOf(p0: Longint): Longint;
    function LastIndexOf(p0: Longint; p1: Longint): Longint;
    function LastIndexOf(p0: string): Longint;
    function LastIndexOf(p0: string; p1: Longint): Longint;
    function Length_: Longint;
    function Matches(p0: string): Boolean;
    function OffsetByCodePoints(p0: Longint; p1: Longint): Longint;
    function RegionMatches(p0: Longint; p1: string; p2: Longint; p3: Longint): Boolean;
    function RegionMatches(p0: Boolean; p1: Longint; p2: string; p3: Longint; p4: Longint): Boolean;
    function Replace(p0: Char; p1: Char): string;
    function ReplaceAll(p0: string; p1: string): string;
    function ReplaceFirst(p0: string; p1: string): string;
    function Split(p0: string): TjxString1DArray;
    function Split(p0: string; p1: Longint): TjxString1DArray;
    function StartsWith(p0: string): Boolean;
    function StartsWith(p0: string; p1: Longint): Boolean;
    function Substring(p0: Longint): string;
    function Substring(p0: Longint; p1: Longint): string;
    function ToCharArray: TjxChar1DArray;
    function ToLowerCase: string;
    function ToString: string;
    function ToUpperCase: string;
    function Trim: string;
    class function ValueOf(p0: Char): string;
    class function ValueOf(p0: Double): string;
    class function ValueOf(p0: Single): string;
    class function ValueOf(p0: Longint): string;
    class function ValueOf(p0: Int64): string;
    class function ValueOf(p0: Ijava_lang_Object): string;
    class function ValueOf(p0: Boolean): string;
    class function ValueOf(p0: TjxChar1DArray): string;
    class function ValueOf(p0: TjxChar1DArray; p1: Longint; p2: Longint): string;
    property CASE_INSENSITIVE_ORDER;
  end;

Если вы декомпилируете двоичный файл и создаете какой-то примитивный источник java, вы можете рассмотреть возможность использования конвертер Java в Pascal. Это должно быть выполнимо без особых проблем, так как вы сказали, что JAR не является чем-то особенным или сложным.