关于ios:如何为c方法编写objective c wrapper?

How to write objective c wrapper for c++ methods?

我需要在objective C 中为 C 类编写一个package类。

我在 Cocoa 项目中使用 C 类时参考了以下 Can\\'t find standard C includes,并且能够摆脱词法或预处理器问题:\\'vector\\' file not found 问题。

但是,我不明白将接受多个参数的 C 方法转换为objective C 方法。

有人可以帮我这样做吗?我想做的是为此 http://breakfastquay.com/rubberband/code-doc/classRubberBand_1_1RubberBandStretcher.html#a0af91755d71eecfce5781f2cd759db85

编写一个package类

我已经尝试过这样做,以下是我坚持使用的方法...

1
2
3
4
5
6
7
8
9
10
11
//  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

/////////////////////////////////////// /////////////////////////////

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//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#>)
}


您应该阅读"编译单元"。简而言之,没有办法告诉编译器用什么语言编写头文件。因此,它始终使用包含标头的源文件的语言。因此,如果您从 .m 文件中包含 C 标头,它将不起作用。对于每个使用 C 标头的 ObjC 文件,您必须将使用它的源文件的文件名后缀从 .m 更改为 .mm。您不需要橡皮筋库的源文件,您只需要制作所有使用它的文件 ObjC 而不是 ObjC。

当然,您可能不想将所有文件都更改为 ObjC 。您用于package C 的替代方法的代码非常接近。我注意到的一件事是您的代码中仍然有 <#foo#> 占位符(Xcode 可能会将它们显示为蓝色圆形圆形装饰,这可能是您以前没有注意到它们的原因)。将它们替换为参数变量的实际名称,就像使用常规 C 函数调用一样,并且都应该编译。即:

1
2
3
-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
    static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process( input, samples, final );
}

另请注意,您似乎在 process 调用之后省略了分号。

顺便说一句,您还可以摆脱在任何地方都必须使用 static_cast 的麻烦,请参阅此处列出的技巧:我可以在编译和链接时将 C 主函数和类与 Objective-C 和/或 C 例程分开吗?这里可能还有一些更有用的信息:How to call C method from Objective-C Cocoa Interface using Objective-C