【问题标题】:CodenameOne - ObjectiveC Bridge - converting C header definition to ObjC BridgeCodenameOne - ObjectiveC 桥 - 将 C 标头定义转换为 ObjC 桥
【发布时间】:2026-02-11 04:30:02
【问题描述】:

我有一个用于 Honeywell Captuvo SL22 的 Objective 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”方法也没有被调用?

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    在 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,但扫描时似乎仍未调用该方法。 Honeywell SDK 说要检查 startDecoderHardware 方法的结果,该方法将返回一个 ProtocolConnectionStatus 枚举,但我不知道如何获得这个枚举值?目前我只是这样称呼它 Objc.eval(captuvoShared,"startDecoderHardware");
    • 枚举实际上只是一个 int。您可以通过查看枚举的标头定义来检查哪个 int 与 value 对应。如果它没有明确设置数字,则第一个值为 0,第二个值为 1,依此类推...github.com/DataSplice/HoneywellScanner/blob/master/src/ios/…。您也可能会发现此线程很有帮助。 *.com/questions/18084791/….
    • 是的!我现在得到了 startDecoderHardware 的正确响应,并且您共享的链接显示(以迂回的方式)我需要使用 createPeerComponent。我现在可以接收条形码数据。非常非常感谢!