我正在尝试使用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);
答案 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()
获取属性名称,该名称与消息名称略有不同。例如。如果您有邮件getName
和setName
,则属性名称为" 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();
经验法则:您提供给消息的参数数量应与消息名称中的冒号数量相同。