How to port corebluetooth from Objective C to Objective C++

China☆狼群 提交于 2019-12-08 12:15:47

问题


I was hoping to get some help with a project I'm working on. I'm currently trying to rework this code https://github.com/djwait/CoreBluetoothExample written in Objective -c into Openframeworks ios Objective c++. However I am a complete beginner to Objective -c and am feeling lost as to how to proceed. The aim is to get access to the variable uint16_t heartRate (from the original app) and use it in c++ code. More than anything I’m confused as to how the original code is creating an ACViewController object and as to how its member functions are being called. My current method has been to copy over the original ACViewController .h to my new project. Then import the ACViewController.h in my ofApp.h, Create a class: ACViewController *acv;

Then in setup: acv = [[ACViewController alloc]init]; But whenever I try to call a function such as [acv renderHeartRateMeasurement]; i get Instance method '-renderHeartRateMeasurement' not found (return type defaults to 'id')

Any help would be much appreciated!

Best, Gustaf


回答1:


If I understand you correctly, you want to be able to call Objective-C methods from C++.

Let's assume you have an Objective-C class defined in MyClass.h as follows:

@interface MyClass : NSObject
-(instancetype)initWithA:(int)a andB:(int)b;
@end

A very simple class, with an init that takes two ints.

To access it from C++, you would do the following in your MyCppClass.hpp:

#include <objc/objc-runtime.h>
#ifdef __OBJC__
#define OBJC_CLASS(name) @class name // if imported in ObjC it knows it is a class
#else
#define OBJC_CLASS(name) typedef struct objc_object name // C++ will treat it as a struct, which is what an ObjC class is internally
#endif

OBJC_CLASS(MyClass);

namespace MyWrapper {
class MyCppClass {
    MyClass* myObj;
public:
    MyCppClass(int a, int b);
    ~MyCppClass();
};
}

If your C++ code will call ObjC classes/methods then the ObjC runtime has to be available. The macros allow forward declaration of ObjC classes in C++ code, and it will compile and run just fine. C++ will not complain. Just include MyCppClass.hpp in your C++ file, and use it like any C++ class.

Now the last step is in your MyCppClass.mm, which is an Objective-C++ file define as follows:

#include "MyCppClass.hpp"
#import "MyClass.h" // this is your ObjC class, imported here because you can't import it in C++ header

namespace MyWrapper {
MyCppClass::MyCppClass(int a, int b) :
myObj([[MyClass alloc] initWithA:a andB:b]) { }

MyCppClass::~ MyCppClass() {
    [myObj release];
}

One final note, MyCppClass.mm needs to be compiled with compile with -fno-objc-arc flag



来源:https://stackoverflow.com/questions/42066742/how-to-port-corebluetooth-from-objective-c-to-objective-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!