CodenameOne-ObjectiveC桥-如何从本机SDK读取NSString

CodenameOne-ObjectiveC桥-如何从本机SDK读取NSString,codenameone,Codenameone,我正在尝试从CodenameOne中使用ObjectiveC桥库,因为它听起来像是一个非常有用的工具。我尝试使用的本机iOS SDK是霍尼韦尔Captuvo SDK。但是,当我尝试调用getCaptuvoName函数时,它应该以NSString形式返回设备的名称,我得到的结果是“不可用”?我正在使用的代码: if (Objc.isSupported()) { Pointer captuvoShared =eval("Captuvo.sharedCaptuvoDev

我正在尝试从CodenameOne中使用ObjectiveC桥库,因为它听起来像是一个非常有用的工具。我尝试使用的本机iOS SDK是霍尼韦尔Captuvo SDK。但是,当我尝试调用getCaptuvoName函数时,它应该以NSString形式返回设备的名称,我得到的结果是“不可用”?我正在使用的代码:

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

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

作为读者的参考,这是您正在使用的API:

因此,
getCaptuvoName
是一条返回
NSString
的“消息”。因此,您需要做的第一件事是调用消息:

Pointer p = Objc.eval(instance, "getCaptuvoName").asPointer();
现在需要将指针转换为Java字符串:

String name = p.asString();
请注意,您需要
CaptuvoEventsProtocol
实例
来执行
eval

Objc.getProperty()
采用属性名称,该名称与消息名称稍有不同。例如,如果您有消息
getName
setName
,则属性名称将为“name”。例如,以下内容将等效:

Objc.eval(myObj,“getName”)
Objc.getProperty(myObj,“name”)

在您的情况下,您正在尝试调用
getCaptuvoName
消息。因此,您可以执行
Objc.eval(实例,“getCaptuvoName”)
Objc.getProperty(实例,“captuvoName”)
但不能执行
Objc.getProperty(实例,“getCaptuvoName”)

对代码的另一个观察

指针captuvoShared=eval(“Captuvo.sharedCaptuvoDevice”,0).asPointer()

sharedCaptuvoDevice
消息不带任何参数,因此不应传递“0”参数。应该是:

指针captuvoShared=eval(“Captuvo.sharedCaptuvoDevice”).asPointer()


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

实际上,桥会自动封送NSString和java.lang.String之间的数据,因此正确的做法是执行
Objc.eval(实例,“getCaptuvoName”).asString()
String name = p.asString();