Alljoyn 初始化总线附件抛出 EXC_BAD_ACCESS
Alljoyn initialising bus attachment throws EXC_BAD_ACCESS
我正在尝试使用 alljoyn 库创建一个 iOS 应用程序。但是,当我尝试通过调用 busAttachment = AJNBusAttachment.init(applicationName: "BusName", allowRemoteMessages: true);
在 swift 中创建总线附件时,我在运行时遇到了 EXC_BAD_ACCESS
错误。
这是我用来创建和使用总线附件的class
class HostController: UIViewController {
var hostApi: HostApi!
var busAttachment: AJNBusAttachment!
var sessionOpts: AJNSessionOptions!
var CONTACT_PORT: AJNSessionPort = 12345
var serviceName: String = "org.company.appname.HelloWorld"
override func viewDidLoad() {
super.viewDidLoad();
NSLog("HostController viewDidLoad");
var status: QStatus!
busAttachment = AJNBusAttachment(applicationName: "BusName", allowRemoteMessages: true);
busAttachment.registerBusListener(BusListener());
hostApi = HostApi.init(busAttachment: busAttachment, onPath: "/HostService");
status = busAttachment.start();
if (status != ER_OK) {
NSLog("busAttachment.start, Status: %s", QCC_StatusText(status));
}
status = busAttachment.registerBusObject(hostApi);
if (status != ER_OK) {
NSLog("busAttachment.registerBusObject, Status: %s", QCC_StatusText(status));
}
status = busAttachment.connectWithArguments(nil);
if (status != ER_OK) {
NSLog("busAttachment.connectWithArguments, Status: %s", QCC_StatusText(status));
}
status = busAttachment.requestWellKnownName(serviceName, withFlags: kAJNBusNameFlagReplaceExisting | kAJNBusNameFlagDoNotQueue)
if (status != ER_OK) {
NSLog("busAttachment.requestWellKnownName, Status: %s", QCC_StatusText(status));
}
sessionOpts = AJNSessionOptions.init(trafficType: kAJNTrafficMessages, supportsMultipoint: true, proximity: kAJNProximityAny, transportMask: kAJNTransportMaskTCP);
status = busAttachment.bindSessionOnPort(CONTACT_PORT, withOptions: sessionOpts, withDelegate: nil);
if (status != ER_OK) {
NSLog("busAttachment.bindSessionOnPort, Status: %s", QCC_StatusText(status));
}
status = busAttachment.advertiseName(serviceName, withTransportMask: sessionOpts.transports);
if (status != ER_OK) {
NSLog("busAttachment.advertiseName, Status: %s", QCC_StatusText(status));
}
NSLog("Done");
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning();
// Dispose of any resources that can be recreated.
}
class BusListener: NSObject, AJNBusListener {}
class SessionPortListener: NSObject, AJNSessionPortListener {
func shouldAcceptSessionJoinerNamed(joiner: String!, onSessionPort sessionPort: AJNSessionPort, withSessionOptions options: AJNSessionOptions!) -> Bool {
if (sessionPort == 12345) {
NSLog("New peer joining session: %s", joiner);
return true;
} else {
return false;
}
}
}
}
有一件事我可能遗漏了,在 java 上我们必须调用 org.alljoyn.bus.alljoyn.DaemonInit.PrepareDaemon(context);
才能使用总线附件,但是在为 iOS 提供的样本中似乎没有是一个等效的调用。也许我只是错过了它,它被放在其他地方,或者 iOS 上没有等效项。
与Java一样,您需要先初始化 AllJoyn,然后才能使用它。
为了解决这个问题,我将 #import "AJNInit.h"
添加到我的桥接头并将其添加到我的 swift 以初始化 AllJoyn。
AJNInit.alljoynInit();
AJNInit.alljoynRouterInit();
您还应该调用这些方法来释放 AllJoyn 使用的资源。
AJNInit.alljoynShutdown();
AJNInit.alljoynRouterShutdown();
我正在尝试使用 alljoyn 库创建一个 iOS 应用程序。但是,当我尝试通过调用 busAttachment = AJNBusAttachment.init(applicationName: "BusName", allowRemoteMessages: true);
在 swift 中创建总线附件时,我在运行时遇到了 EXC_BAD_ACCESS
错误。
这是我用来创建和使用总线附件的class
class HostController: UIViewController {
var hostApi: HostApi!
var busAttachment: AJNBusAttachment!
var sessionOpts: AJNSessionOptions!
var CONTACT_PORT: AJNSessionPort = 12345
var serviceName: String = "org.company.appname.HelloWorld"
override func viewDidLoad() {
super.viewDidLoad();
NSLog("HostController viewDidLoad");
var status: QStatus!
busAttachment = AJNBusAttachment(applicationName: "BusName", allowRemoteMessages: true);
busAttachment.registerBusListener(BusListener());
hostApi = HostApi.init(busAttachment: busAttachment, onPath: "/HostService");
status = busAttachment.start();
if (status != ER_OK) {
NSLog("busAttachment.start, Status: %s", QCC_StatusText(status));
}
status = busAttachment.registerBusObject(hostApi);
if (status != ER_OK) {
NSLog("busAttachment.registerBusObject, Status: %s", QCC_StatusText(status));
}
status = busAttachment.connectWithArguments(nil);
if (status != ER_OK) {
NSLog("busAttachment.connectWithArguments, Status: %s", QCC_StatusText(status));
}
status = busAttachment.requestWellKnownName(serviceName, withFlags: kAJNBusNameFlagReplaceExisting | kAJNBusNameFlagDoNotQueue)
if (status != ER_OK) {
NSLog("busAttachment.requestWellKnownName, Status: %s", QCC_StatusText(status));
}
sessionOpts = AJNSessionOptions.init(trafficType: kAJNTrafficMessages, supportsMultipoint: true, proximity: kAJNProximityAny, transportMask: kAJNTransportMaskTCP);
status = busAttachment.bindSessionOnPort(CONTACT_PORT, withOptions: sessionOpts, withDelegate: nil);
if (status != ER_OK) {
NSLog("busAttachment.bindSessionOnPort, Status: %s", QCC_StatusText(status));
}
status = busAttachment.advertiseName(serviceName, withTransportMask: sessionOpts.transports);
if (status != ER_OK) {
NSLog("busAttachment.advertiseName, Status: %s", QCC_StatusText(status));
}
NSLog("Done");
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning();
// Dispose of any resources that can be recreated.
}
class BusListener: NSObject, AJNBusListener {}
class SessionPortListener: NSObject, AJNSessionPortListener {
func shouldAcceptSessionJoinerNamed(joiner: String!, onSessionPort sessionPort: AJNSessionPort, withSessionOptions options: AJNSessionOptions!) -> Bool {
if (sessionPort == 12345) {
NSLog("New peer joining session: %s", joiner);
return true;
} else {
return false;
}
}
}
}
有一件事我可能遗漏了,在 java 上我们必须调用 org.alljoyn.bus.alljoyn.DaemonInit.PrepareDaemon(context);
才能使用总线附件,但是在为 iOS 提供的样本中似乎没有是一个等效的调用。也许我只是错过了它,它被放在其他地方,或者 iOS 上没有等效项。
与Java一样,您需要先初始化 AllJoyn,然后才能使用它。
为了解决这个问题,我将 #import "AJNInit.h"
添加到我的桥接头并将其添加到我的 swift 以初始化 AllJoyn。
AJNInit.alljoynInit();
AJNInit.alljoynRouterInit();
您还应该调用这些方法来释放 AllJoyn 使用的资源。
AJNInit.alljoynShutdown();
AJNInit.alljoynRouterShutdown();