2011-11-02 2 views
7

Có thư viện nhị phân Java jar với các lớp/hàm được mô tả làm cho một số thứ hữu ích (không có gì đặc biệt chỉ đơn giản là Java - không có JNI). Không có nguồn nào.Truy cập vào jar Java từ Delphi

Có nhiệm vụ gọi các chức năng đó trực tiếp từ Delphi. Làm thế nào để làm điều đó?

P.S. Tôi không biết gì về Delphi, nhưng tôi biết rất nhiều về Java.

+2

Điều thích hợp là bạn nên đề cập đến JNI vì đó chính xác là những gì bạn sẽ sử dụng. Hãy nhớ rằng JNI là một con đường hai chiều. Nó không chỉ cho phép mã Java gọi mã gốc, mà còn cho phép mã nguồn gốc gọi mã Java. –

+2

Tôi không biết liệu điều này có khả thi hay không, nhưng dường như nó đang sử dụng JNI. Google là Omniscient: http://home.pacifier.com/~mmead/jni/delphi/informant/di200310kw.htm – GolezTrol

Trả lời

6

Không, bạn không thể di chuyển là JNI.

Một vài nguồn:

Trừ khi bạn có quá nhiều thời gian trên bàn tay của bạn, trong đó bạn có thể giải nén JAR các tệp (chúng là các tệp ZIP), viết máy ảo Java của riêng bạn trong Delphi và đi từ đó ;-)

+0

Tôi sẽ ủng hộ SO tìm kiếm thay vì Google: http://stackoverflow.com/search?q=%5Bdelphi % 5D + jni – splash

+1

Trong thực tế, tôi có nguồn của những lọ, kể từ khi tôi là tác giả. Mục đích là để cung cấp cho một bên khác không phải nguồn, nhưng chỉ là bình nhị phân với mô tả đầu vào/đầu ra. Vì vậy, tôi sẽ ngay lập tức phát triển cổng JNI cho bình của tôi. Cảm ơn nhiều! – barmaley

+0

@splash cảm ơn thời gian. Theo kinh nghiệm của tôi, nó thay đổi; đôi khi tìm kiếm trên google tốt hơn nhiều, đôi khi tìm kiếm SO. Nó là tốt để thử cả hai. –

1

Tệp jar có chứa một lớp chính có thể được gọi từ dòng lệnh không? Nếu vấn đề được giải quyết thì Delphi có thể thực thi các thao tác dòng lệnh. Nếu không có lớp chính, bạn có thể tạo một lớp gọi tệp jar gốc.

0

Nếu bạn dịch ngược tệp nhị phân và tạo ra một loại nguồn java nguyên thủy, thì bạn có thể xem xét sử dụng Java to Pascal converter. Điều này có thể thực hiện được mà không gặp nhiều rắc rối kể từ khi bạn nói rằng JAR không có gì đặc biệt hoặc phức tạp.

1

Là giải pháp thay thế nhanh và đơn giản hơn với mức độ thấp, tốn thời gian và dễ bị lỗi JNI từ tùy chọn Delphi, bạn nên thử Java for Delphi.

Bạn sẽ làm việc với API hướng đối tượng, sẽ cần một phần mã khi so sánh với JNI và giải quyết vấn đề tích hợp Delphi/Java trong vài giờ thay vì ngày, tuần (hoặc tháng tùy thuộc vào việc sử dụng trường hợp).

Ví dụ, dưới đây là khai báo công khai của loại Delphi tương ứng với java.lang.String với một trích xuất mã cho thấy nó có thể được sử dụng như thế nào.

Đừng ngần ngại liên hệ với J4SOFT, sẽ rất sẵn lòng trợ giúp bạn.

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;