在Delphi中使用第三者Android API [英] Consuming a 3rd Party Android API in Delphi

查看:128
本文介绍了在Delphi中使用第三者Android API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Delphi Seattle中的Honeywell SDK来控制Android设备上的扫描仪.

I am trying to use a Honeywell SDK in Delphi Seattle to control a scanner on an Android device.

Honeywell为我提供了一个名为DataCollection.jar的SDK jar.我使用Java2OP实用程序创建了我的JNI桥,但是遇到了麻烦.老实说,我是一个新手,不知道在哪里看或如何实现这一点.我也搜索了类似的例子.

Honeywell provided me with a SDK jar called DataCollection.jar. I used the Java2OP utility to create my JNI bridge but am having trouble with it. To be honest I am a novice on this and am not sure where to look or how to implement this. I have searched for similar examples too.

我知道我必须创建一个TJAidmanager类型的对象才能访问条形码读取器功能,其定义为:

I know I have to create an object of type TJAidmanager to access the barcode reader functions , it is defined as :

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;

java示例代码如下:

The java sample code looks like this :

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();
}
}
}

现在,当我尝试在delphi中使用它时,我已经尝试过了,但是遇到了分段错误:

Now when I try and use this in delphi , I have tried this but get a segmentation fault :

var cb : JAidcManager_CreatedCallback;
begin
      TJAidcManager.JavaClass.create(SharedActivity,TJAidcManager_CreatedCallback.Wrap((cb as ILocalObject).getobjectID));

JAidcManager_CreatedCallback定义为:

The JAidcManager_CreatedCallback is defined as :

 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;

我假设必须为TJAidcManager类型的变量实现onCreated事件,但是我不确定如何将所有这些链接在一起.

I assume I have to implement an onCreated Event for a variable of type TJAidcManager but I am not sure how to link these all together.

然后我尝试了这个:

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

我还将其添加到实现部分的JNIBridge单元中:

I also added this to the JNIBridge Unit in the implementation section :

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

运行此命令时,出现"java.lang.SecurityException:不允许绑定到服务意图{acct = com.honeywell.decode.DecodeService cmp = com.intermec.datacollectionservice/.DataCollectionService}"错误.我尝试将绑定Remoteviews"添加到权限中,但这无济于事.

When running this, I get a "java.lang.SecurityException: Not allowed to bind to service Intent {acct=com.honeywell.decode.DecodeService cmp=com.intermec.datacollectionservice/.DataCollectionService}" error. I tried adding "Bind Remoteviews" to permissions but that didn't help.

如果有人可以建议我或指导我如何在Delphi中创建AidcManager的正确方向,我们将不胜感激.

If anyone could advise me or point me in the correct direction on how to create the AidcManager in Delp that would be appreciated.

推荐答案

此问题已解决.我需要扩展com.embarcadero.firemonkey.FMXNativeActivity.

This problem has been solved. I needed to extend the com.embarcadero.firemonkey.FMXNativeActivity.

完整解决方案的详细信息可以在 Embaradero论坛(带有源链接)上找到

The details of the full solution can be found here Embaradero Forum with link to Source

这篇关于在Delphi中使用第三者Android API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆