2016-04-05 9 views
0

Ich versuche ein Honeywell SDK in Delphi Seattle zu verwenden, um einen Scanner auf einem Android-Gerät zu steuern.Eine Android-API von Drittanbietern in Delphi verwenden

Honeywell stellte mir ein SDK-Jar namens DataCollection.jar zur Verfügung. Ich habe das Java2OP-Dienstprogramm verwendet, um meine JNI-Bridge zu erstellen, habe aber Probleme damit. Um ehrlich zu sein bin ich ein Anfänger und bin mir nicht sicher, wo ich hinschauen oder wie ich das umsetzen soll. Ich habe auch nach ähnlichen Beispielen gesucht.

Ich weiß, ich habe ein Objekt vom Typ TJAidmanager zu erstellen, um die Funktionen Barcodeleser zuzugreifen, wird es wie folgt definiert:

JAidcManagerClass = interface(JObjectClass) 
['{EE70EF80-4CA8-4FE0-B912-6453CA0336CD}'] 
{class} function _GetBARCODE_DEVICE_CONNECTED: Integer; cdecl; 
{class} function _GetBARCODE_DEVICE_DISCONNECTED: Integer; cdecl; 
{class} procedure addBarcodeDeviceListener(P1:  JAidcManager_BarcodeDeviceListener); cdecl; 
{class} procedure close; cdecl; 
{class} procedure create(P1: JContext; P2: JAidcManager_CreatedCallback); cdecl; 
{class} function createBarcodeReader: JBarcodeReader; cdecl; overload; 
{class} function createBarcodeReader(P1: JString): JBarcodeReader; cdecl;  overload; 
{class} function listBarcodeDevices: JList; cdecl; 
{class} function listConnectedBarcodeDevices: JList; cdecl; 
{class} procedure removeBarcodeDeviceListener(P1: JAidcManager_BarcodeDeviceListener); cdecl; 
{class} property BARCODE_DEVICE_CONNECTED: Integer read  _GetBARCODE_DEVICE_CONNECTED; 
{class} property BARCODE_DEVICE_DISCONNECTED: Integer read _GetBARCODE_DEVICE_DISCONNECTED; 
end; 

[JavaSignature('com/honeywell/aidc/AidcManager')] 
JAidcManager = interface(JObject) 
['{98A668C5-9204-4F0C-98B0-A8E1F1124738}'] 
end; 
TJAidcManager = class(TJavaGenericImport<JAidcManagerClass, JAidcManager>) end; 

Der Java-Beispielcode wie folgt aussieht:

import com.honeywell.aidc.*; 
public class MainActivity extends Activity { 
private AidcManager manager; 
private BarcodeReader reader; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

// create the AidcManager providing a Context and an 
// CreatedCallback implementation. 
AidcManager.create(this, new AidcManager.CreatedCallback() { 

@Override 
public void onCreated(AidcManager aidcManager) { 
manager = aidcManager; 
reader = manager.createBarcodeReader(); 
} 
} 
} 

@Override 
public void onDestroy() { 
super.onDestroy(); 
// make sure that AidcManager isn't null 
if (reader != null) { 
// close BarcodeReader to clean up resources. 
// once closed, the object can no longer be used. 
reader.close(); 
} 
if (manager != null) { 
// close AidcManager to disconnect from the scanner service. 
// once closed, the object can no longer be used. 
manager.close(); 
} 
} 
} 

Jetzt Wenn ich versuche, dies in Delphi zu verwenden, habe ich dies versucht, aber einen Segmentierungsfehler erhalten:

Die JAidcManager_CreatedCallback ist definiert als:

JAidcManager_CreatedCallbackClass = interface(IJavaClass) 
    ['{E27EF6BB-C642-42B6-98CA-6C270A1AD5D1}'] 
    {class} procedure onCreated(P1: JAidcManager); cdecl;//Deprecated 
    end; 

    [JavaSignature('com/honeywell/aidc/AidcManager$CreatedCallback')] 
    JAidcManager_CreatedCallback = interface(IJavaInstance) 
    ['{E2713D70-1CE6-43AA-9181-7054BD787F1B}'] 
    end; 
    TJAidcManager_CreatedCallback = class(TJavaGenericImport<JAidcManager_CreatedCallbackClass, JAidcManager_CreatedCallback>) end; 

ich mich, aber ich bin mir nicht sicher davon ausgehen, habe ein OnCreated Ereignis für eine Variable vom Typ TJAidcManager zu implementieren, wie diese alle miteinander zu verknüpfen.

Ich versuchte dann das:

var cb : JObject; 
begin 
    cb := TjObject.Create; 
    TJAidcManager.JavaClass.create(SharedActivityContext,TJAidcManager_CreatedCallback.Wrap((cb as ILocalObject).getobjectID)); 

Ich habe auch dies auf die JNIBridge Einheit im Implementationsabschnitt:

procedure onCreated(P1: JAidcManager); cdecl;//Deprecated 
begin 
    Form2.manager := P1; 
end; 

Wenn dies ausgeführt wird, erhalte ich eine „java.lang.SecurityException: Nicht zulässig, um Service zu binden Absicht {acct = com.honeywell.decode.DecodeService cmp = com.intermec.datacollectionservice/.DataCollectionService} "Fehler. Ich habe versucht, "Bind RemoteViews" zu Berechtigungen hinzuzufügen, aber das hat nicht geholfen.

Wenn jemand mich beraten oder in die richtige Richtung zeigen könnte, wie man den AidcManager in Delphi erstellt, wäre das zu schätzen.

Antwort

Verwandte Themen