CodenameOne-ObjectiveC桥-将C头定义转换为ObjC桥

CodenameOne-ObjectiveC桥-将C头定义转换为ObjC桥,codenameone,Codenameone,我对霍尼韦尔Captuvo SL22有一个客观的C方法,SDK说我可以用它来接收扫描的条形码数据: -(void)decoderDataReceived:(NSString*)data; 我试图在ObjectiveC桥中使用它,如下所示: Objc.DelegateObject delegate = Objc.makeDelegate() .add("decoderDataReceived:", Method.create(Method.ArgType.Void , new Metho

我对霍尼韦尔Captuvo SL22有一个客观的C方法,SDK说我可以用它来接收扫描的条形码数据:

-(void)decoderDataReceived:(NSString*)data;
我试图在ObjectiveC桥中使用它,如下所示:

Objc.DelegateObject delegate = Objc.makeDelegate()
    .add("decoderDataReceived:", Method.create(Method.ArgType.Void , new Method.ArgType[]{Method.ArgType.CString},args ->
    {
        Log.p("Received " + args[0]);
        return null;
    }));
Objc.eval(captuvoShared, "addCaptuvoDelegate:", delegate);

但是,即使我已成功连接到扫描仪,并且当我进行扫描时,扫描仪会亮起并发出嘟嘟声,“decoderDataReceived”方法不会被调用?

在Objective-C中,
NSString
只是一个常规对象(即它是
NSObject
的子类),因此,您将使用参数类型
ArgType.Object
ArgType.CString
参数类型将用于
const char*

所以只需将代码更改为


Objc.DelegateObject delegate = Objc.makeDelegate()
    .add("decoderDataReceived:", Method.create(Method.ArgType.Void , new Method.ArgType[]{Method.ArgType.Object},args ->
    {
        Log.p("Received " + args[0]);
        return null;
    }));
Objc.eval(captuvoShared, "addCaptuvoDelegate:", delegate);

你应该很好。

我已将CString更改为Object,但扫描时似乎仍然没有调用该方法。霍尼韦尔SDK要求检查startDecoderHardware方法的结果,该方法将返回ProtocolConnectionStatus枚举,但我不确定如何获取该枚举值?目前我只是这样称呼它Objc.eval(captuvoShared,“startDecoderHardware”);枚举实际上只是一个int。通过查看枚举的头定义,可以检查哪个int与值对应。如果它没有显式地设置一个数字,那么第一个值是0,第二个值是1,以此类推。您也可能会发现此线程很有用。对我现在从startDecoderHardware得到了正确的响应,您共享的链接(以一种迂回的方式)表明我需要使用createPeerComponent。我现在可以接收条形码数据了。非常非常感谢!