有一些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