如何为 C++ 方法编写 objective c 包装器?
How to write objective c wrapper for c++ methods?
我需要在 objective c 中为 C++ class 编写包装器 class。
我参考了以下 Can't find standard C++ includes when using C++ class in Cocoa project 并且能够解决词法或预处理器问题:'vector' 文件未找到问题。
但是,我不明白将接受多个参数的 C++ 方法转换为 objective c 方法。
有人可以帮我这样做吗?我想做的是为此 http://breakfastquay.com/rubberband/code-doc/classRubberBand_1_1RubberBandStretcher.html#a0af91755d71eecfce5781f2cd759db85
写一个包装器 class
我已经尝试这样做了,以下是我坚持使用的方法...
// Wrapper.h
#import <Foundation/Foundation.h>
@interface Wrapper : NSObject {
void *myRubberBandStretcher;
}
#pragma mark - Member Functions
-(void)process:(const float)input samples:(size_t)samples final:(bool)final;
@end
////////////////////////////////////////// /////////////////////////////////
//Wrapper.mm
#import "Wrapper.h"
#import "RubberBandStretcher.h"
@implementation Wrapper
-(id)init {
self = [super init];
if (self) {
myRubberBandStretcher = new RubberBand::RubberBandStretcher::RubberBandStretcher(44100, 2, 0, 1.0, 1.0);
}
return self;
}
-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process(<#const float *const *input#>, <#size_t samples#>, <#bool final#>)
}
您应该阅读 "compilation units"。简而言之,无法判断 header 文件是用哪种语言为编译器编写的。因此,它始终使用包含 header 的源文件的语言。因此,如果您从 .m
文件中包含 C++ header,它将不起作用。对于 每个 使用 C++ header 的 ObjC 文件,您必须更改 使用 它的源文件的文件名后缀.m
到 .mm
。您不需要 rubberband 库的源文件,您只需要制作所有使用它的文件 ObjC++ 而不仅仅是 ObjC。
当然,您可能不想将所有文件更改为 ObjC++。您用于包装 C++ 的替代方法的代码非常接近。我注意到的一件事是您的代码中仍然有 <#foo#>
占位符(Xcode 可能将它们显示为蓝色圆形漩涡装饰,这可能是您之前没有注意到它们的原因)。将它们替换为参数变量的实际名称,就像使用常规 C 函数调用一样,所有这些都应该编译。即:
-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process( input, samples, final );
}
另请注意,您似乎在 process
调用后省略了分号。
顺便说一句,你也可以摆脱必须在任何地方使用 static_cast
的麻烦,请参阅此处列出的技巧:Can I separate C++ main function and classes from Objective-C and/or C routines at compile and link? and there might also be some more useful info here: How to call C++ method from Objective-C Cocoa Interface using Objective-C++
我需要在 objective c 中为 C++ class 编写包装器 class。
我参考了以下 Can't find standard C++ includes when using C++ class in Cocoa project 并且能够解决词法或预处理器问题:'vector' 文件未找到问题。
但是,我不明白将接受多个参数的 C++ 方法转换为 objective c 方法。
有人可以帮我这样做吗?我想做的是为此 http://breakfastquay.com/rubberband/code-doc/classRubberBand_1_1RubberBandStretcher.html#a0af91755d71eecfce5781f2cd759db85
写一个包装器 class我已经尝试这样做了,以下是我坚持使用的方法...
// Wrapper.h
#import <Foundation/Foundation.h>
@interface Wrapper : NSObject {
void *myRubberBandStretcher;
}
#pragma mark - Member Functions
-(void)process:(const float)input samples:(size_t)samples final:(bool)final;
@end
////////////////////////////////////////// /////////////////////////////////
//Wrapper.mm
#import "Wrapper.h"
#import "RubberBandStretcher.h"
@implementation Wrapper
-(id)init {
self = [super init];
if (self) {
myRubberBandStretcher = new RubberBand::RubberBandStretcher::RubberBandStretcher(44100, 2, 0, 1.0, 1.0);
}
return self;
}
-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process(<#const float *const *input#>, <#size_t samples#>, <#bool final#>)
}
您应该阅读 "compilation units"。简而言之,无法判断 header 文件是用哪种语言为编译器编写的。因此,它始终使用包含 header 的源文件的语言。因此,如果您从 .m
文件中包含 C++ header,它将不起作用。对于 每个 使用 C++ header 的 ObjC 文件,您必须更改 使用 它的源文件的文件名后缀.m
到 .mm
。您不需要 rubberband 库的源文件,您只需要制作所有使用它的文件 ObjC++ 而不仅仅是 ObjC。
当然,您可能不想将所有文件更改为 ObjC++。您用于包装 C++ 的替代方法的代码非常接近。我注意到的一件事是您的代码中仍然有 <#foo#>
占位符(Xcode 可能将它们显示为蓝色圆形漩涡装饰,这可能是您之前没有注意到它们的原因)。将它们替换为参数变量的实际名称,就像使用常规 C 函数调用一样,所有这些都应该编译。即:
-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process( input, samples, final );
}
另请注意,您似乎在 process
调用后省略了分号。
顺便说一句,你也可以摆脱必须在任何地方使用 static_cast
的麻烦,请参阅此处列出的技巧:Can I separate C++ main function and classes from Objective-C and/or C routines at compile and link? and there might also be some more useful info here: How to call C++ method from Objective-C Cocoa Interface using Objective-C++