線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1832
推到 Plurk!
推到 Facebook!

XE7下調用JAR問題

答題得分者是:aftcast
h@visli
資深會員


發表:101
回覆:417
積分:418
註冊:2004-02-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-02-25 17:42:16 IP:119.139.xxx.xxx 未訂閱
我的APP需要調用第三方Codebar工具,廠家提供了Jar包,我用java2op.exe導出pascal接口文件:


[code delphi]

// ===== Interface declarations =====

JBarCode2_ScanResultClass = interface(IJavaClass)
['{332B0E9C-523A-49FF-88DA-03E31B4A1AC3}']
end;

[JavaSignature('com/capipad/BarCode2/ScanResult')]
JBarCode2_ScanResult = interface(IJavaInstance)
['{67743632-1D2F-447B-8468-90222ED141EA}']
procedure onResult(P1: JString); cdecl;
end;
TJBarCode2_ScanResult = class(TJavaGenericImport) end;

Jbarcode2Class = interface(JObjectClass)
['{C3E80538-E607-4E5D-BF9C-3958E262B003}']
{class} function BarCodeDeInit: Integer; cdecl;
{class} procedure BarCodeHandFreeRead; cdecl;
{class} function BarCodeInit: Integer; cdecl;
{class} procedure BarCodeRead; cdecl;
{class} function init: Jbarcode2; cdecl;
{class} procedure registScanDataListen(P1: JBarCode2_ScanResult); cdecl;
{class} procedure unregistScanDataListen; cdecl;
end;
[/code]


其中JBarCode2_ScanResult中有個onResult事件,我不知道在Delphi下應該如何實現調用?

我在廠家提供的Java Demo中看到Java中調用是這樣的:


[code cpp]
barcode2.registScanDataListen(new ScanResult() {

@Override
public void onResult(String data) {
if (data != null && !data.isEmpty()) {
msgTextView.append("扫描结果:\n" data "\n");

} else {
mStateView.setText("扫描失败!");
}
}
}

});

[/code]

面jar包中的ScanResult是個接口:

[code cpp]
package com.capipad.BarCode2;

public interface ScanResult {
void onResult(java.lang.String s);
}

[/code]


------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
aftcast
站務副站長


發表:81
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-03-02 12:29:17 IP:114.32.xxx.xxx 訂閱
這個題目的難度指數大概是4點5星。

因為難,且我自己沒時間,所以只能提示你如何處理。

你必需使用TJavaLocal配合你的Jxxinterface形成一個 class。然後在delphi裡實作那個class,進一步的create那個class,然後pass in barcode2.registScanDataListen( …

for example:

TJBarCode2_ScanResultClass = class (TJavaLocal, JBarCode2_ScanResultClass)
…… 實作
procedure onResult(P1: JString); cdecl;



barcode2.registScanDataListen( TJBarCode2_ScanResultClass.create )


細節官網沒有,一般也難google到,我是自己讀了delphi源碼,加上對java的了解,才知道的。若有興趣,我可以和你說,它與java之proxy class (reflection有關),加上 TJavaLocal 與 embt在它的 classes.dex裡有應用的java程式。才能夠在 delphi 裡去實作 java的 interface,而以 delphi的object 來"騙" java 該object 是java object… 沒興趣去理解就不用管了。

可讀TRunnable = class (TJavaLocal, JRunnable) 這個源碼。Runnable這個interface在Java的世界中經常性的會出現。



------



蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2015-03-02 12:36:20, 註解 無‧
系統時間:2017-12-13 1:55:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!