CodenameOne - ObjectiveC Bridge - 如何从本机SDK

时间:2018-01-22 18:21:40

标签: codenameone

我正在尝试使用CodenameOne中的ObjectiveC Bridge库,因为它听起来像是一个非常有用的工具。我试图使用的原生iOS SDK是霍尼韦尔Captuvo SDK。但是,当我尝试调用getCaptuvoName函数时,它应该将设备的名称作为NSString返回,我得到的是#34;不可用"?我正在使用的代码:

    if (Objc.isSupported())
    {
        Pointer captuvoShared =eval("Captuvo.sharedCaptuvoDevice",0).asPointer();
        if (captuvoShared!=null)
        {
            Dialog.show("ObjC", "Captuvo not null", "OK", null);
            String name=Objc.getProperty(captuvoShared,"getCaptuvoName").asString();
            Dialog.show("ObjC", name, "OK", null);
        }
        else
            Dialog.show("ObjC", "Captuvo NULL!", "OK", null);
    }
    else
        Dialog.show("ObjC", "Objective-C not supported on this platform", "OK", null);

2 个答案:

答案 0 :(得分:1)

不是这方面的专家,所以我可能错了......

作为阅读它的人的参考,这是您正在使用的API:https://github.com/DataSplice/HoneywellScanner/blob/master/src/ios/Honeywell/Captuvo.h

-(NSString*)getCaptuvoName;

所以getCaptuvoName是"消息"返回NSString。所以你需要做的第一件事是调用消息:

Pointer p = Objc.eval(instance, "getCaptuvoName").asPointer();

现在需要将指针转换为Java String:

String name = p.asString();

请注意,您需要instance的{​​{1}}才能执行CaptuvoEventsProtocol

答案 1 :(得分:1)

Objc.getProperty()获取属性名称,该名称与消息名称略有不同。例如。如果您有邮件getNamesetName,则属性名称为" name"。例如。以下内容相同:

Objc.eval(myObj, "getName")Objc.getProperty(myObj, "name")

在您的情况下,您尝试拨打getCaptuvoName消息。因此,您可以执行Objc.eval(instance, "getCaptuvoName")Objc.getProperty(instance, "captuvoName")但不能Objc.getProperty(instance, "getCaptuvoName")

您的代码的另一个观察。

Pointer captuvoShared =eval("Captuvo.sharedCaptuvoDevice",0).asPointer();

sharedCaptuvoDevice消息不带任何参数,因此您不应该通过" 0"参数。它应该是:

Pointer captuvoShared =eval("Captuvo.sharedCaptuvoDevice").asPointer();

经验法则:您提供给消息的参数数量应与消息名称中的冒号数量相同。