有一些Java jar二進制庫,其中描述的類/函數會生成一些有用的東西(沒有什麼特別的只是普通的Java - 沒有JNI)。沒有可用的來源。從Delphi訪問Java jar
有一個任務直接從Delphi中調用這些函數。怎麼做?
P.S.我對Delphi一無所知,但我對Java很瞭解。
有一些Java jar二進制庫,其中描述的類/函數會生成一些有用的東西(沒有什麼特別的只是普通的Java - 沒有JNI)。沒有可用的來源。從Delphi訪問Java jar
有一個任務直接從Delphi中調用這些函數。怎麼做?
P.S.我對Delphi一無所知,但我對Java很瞭解。
不,你不能走的路是JNI。
一些資源:
除非你有你的手太多時間,在這你可以解壓縮JAR文件(它們是ZIP文件),在Delphi中編寫您自己的Java VM並從那裏開始;-)
該jar文件是否包含可以從命令行調用的主類?如果這樣的問題解決了,Delphi可以執行命令行操作。如果沒有主類,則可以創建一個調用原始jar文件的類。
如果您反編譯二進制文件並生成某種原始java源,那麼您可以考慮使用Java to Pascal converter。這應該是可行的,因爲你說JAR沒有特別的或複雜的。
作爲Delphi選項的低級別,耗時且容易出錯的JNI的替代方案,您應該嘗試Java for Delphi。
您將使用面向對象的API,與JNI相比,需要一小部分代碼,並在幾個小時內解決您的Delphi/Java集成問題,而不是幾天,幾周(或幾個月,具體取決於使用情況案件)。
作爲一個例子,下面是對應於java.lang.String的Delphi類型的公共聲明,其中提供了一個代碼解壓縮來展示如何使用它。
不要猶豫,聯繫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;
您提到JNI是合適的,因爲這正是您將要使用的。請記住,JNI是一條雙向的街道。它不僅允許Java代碼調用本地代碼,還允許本地代碼調用Java代碼。 –
我不知道這是否可能,但顯然它使用的是JNI。谷歌是Omniscient:http://home.pacifier.com/~mmead/jni/delphi/informant/di200310kw.htm – GolezTrol