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