从MAC OS X中的c++dylib调用cocoa/obj-c方法
Call a cocoa/obj-c method from a C++ dylib in MAC OS X
由于我对Objective-C编程语言还很陌生,我面临着一个巨大的问题:如何通过向它传递一些参数,从我的动态加载库(用C++制作)中调用我的应用程序(用Objective-C制作)的方法?
我已经在网上挖了几天了,运气不好。我唯一发现的是IMP,但我不确定这是否是我需要的。
实际上这里有很多选项。
- 如果dylib是你自己的,你可以通过Objective-C调用将其编译为Mac OS X和
#ifdef
的Objective-C++(如果你只针对Mac OS,则不编译) - Obj-C和C++都可以使用C接口,所以你可以用C编写一个适配器层(记住Obj-C是C的严格超集),并将其公开给dylib来调用C函数,然后由dylib调用Obj-C代码
- 您可以使用块,它在C、C++中工作,当然还有Obj-C
- 您可以包含objective-c运行时(请参阅文档),并对其进行处理(这是您将使用您提到的
*IMP
的地方) - 另一种选择可能是从Cocoa端使用ObjectiveC++来设置C++对象,并将这些对象暴露给dylib。你将如何做到这一点实际上取决于图书馆是什么以及它是如何使用的等等;我们需要了解更多关于dylib的信息,以及它是如何被用来详细说明这一点的
既然您特别提到使用IMP
,让我们更深入地讨论一下。声明是typedef void (*IMP)(id self, SEL _cmd, ...);
,您可以看到它带有一个指向Obj-C对象的指针,以及一个SEL
(选择器),它只是该方法的一个特殊的C字符串表示。您可以在文档中阅读有关SEL
和IMP
的更多信息。
您还可以使用运行时的C函数(如objc_msgSend
),通过传递指向对象的指针和SEL
来调用方法,就像传递IMP
一样。
这些信息应该足以让你开始。感谢你的提问,顺便说一句,我以前从未真正坐下来思考过将C++与Objective-C结合的所有可能方法。很可能我错过了什么;)
您可以使用目标c运行时
include <objc/runtime.h>
objc_msgSend(id, SEL, arg0, ...)
其中
id-是要发送消息的对象
SEL-是结构指针,描述您发送的消息
arg0,。。。是传递给选择器的参数。
有关运行时的更多了解,请参阅源代码http://www.opensource.apple.com/source/objc4/
您还可以强制转换IMP地址,并调用函数。
int(* foo)(id, SEL, arg) = IMP;
foo(someObject, @selector(someMessage), arg);
相关文章:
- 如何在.obj文件上运行IlDasm?
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 在 opengl 中渲染 obj 文件时出现黑窗口
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- 正在读取 obj 文件!(指数)
- 我在主函数的左括号上不断收到错误,消息为obj\Debug\main.o||在函数"ZN11linked_listC1Ev"中:|
- float* 已在 Gameobject.obj 中定义
- 可执行文件C++包括.obj,.lib和.dll吗?
- C++成功复制动态分配的 obj 而不复制 ctor?
- OBJ 文件C++与 ubuntu 问题
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- OBJ 向量到成员函数
- 在istream_iterator中使用后的 C++ FSTREAM obj 回滚
- 使用sscaf_s从obj读取顶点线不起作用
- 移植DXUT SDKMesh以导入OBJ文件,在哪里添加纹理坐标和索引
- /usr/bin/ld: build-debug/obj/gpsitem.o: 文件无法识别: 文件被截断
- 将多个网格放入单个波前 OBJ 文件中
- :-1: 错误: LNK1104: 无法打开文件"我的项目.obj"
- 从MAC OS X中的c++dylib调用cocoa/obj-c方法
- 是否有可能在c++中编写应用程序的核心,并使用Obj-C和Cocoa作为UI ?