草庐IT

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

codeneng 2023-03-28 原文

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#>)
}

  • 我猜你不需要在 Objective-C 中为 C 创建特殊的package类。只需将实现文件扩展名从 .m 更改为 .mm,您的 C 代码就会开始编译和运行。
  • 我为橡皮筋库创建了静态库,并且只得到了 RubberBandStretcher.h 文件。头文件是用 C 编写的。当我导入头文件并转到头文件并给我"词法或预处理器问题:\\'vector\\'文件未找到问题"错误。我已经摆脱了这个stackoverflow.com/questions/6083764/之后的错误...所以我想我需要写一个package器
  • 您可以将使用 c 语法的文件扩展名更改为 .mm 吗?那么就没有必要纠正package了。
  • @Arjuna 正如我上面所说,我只有头文件和静态库。头文件扩展名为 .h。没有 .m 文件我正在为它编写package类并且有 .h 和 .mm 文件。我在上面的问题中包含了 .h 文件和 .mm 文件,但对如何转换早餐quay.com/rubberband/code-doc/... 文件中可用的 c 方法感到困惑
  • @Arjuna我试图转换为objective C的方法就是这种方法; void RubberBand::RubberBandStretcher::process\\\\t(\\\\tconst float *const * \\\\tinput, size_t \\\\tsamples, bool \\\\tfinal ) 我不知道如何将其转换为objective C,因为它需要几个参数方法。如果您需要查看完整代码,我可以为您上传项目。谢谢
  • 如果将 const float *const * 作为输入类型会发生什么?
  • 当我按照你的建议写它时,它看起来像这样 -(void)process:(const float *const *)input samples:(size_t)samples final:(bool)final { static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher) - > process(<const float *const *input>, <size_t samples>, <bool final>); } 和 xcode 提示我一个错误说 "Expected expression"
  • 请上传您的项目。


您应该阅读"编译单元"。简而言之,没有办法告诉编译器用什么语言编写头文件。因此,它始终使用包含标头的源文件的语言。因此,如果您从 .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

有关关于ios:如何为c方法编写objective c wrapper?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  6. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby - 如何为 emacs 安装 ruby​​-mode - 2

    我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby​​提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs

  9. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  10. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

随机推荐