iOS开发 - 在 Swift 中去调用 C/C++ 代码
source link: https://glumes.com/post/ios/swift-call-c-function/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
众所周知,Swift 是不能直接调用 C/C++ 代码的,而 Objective-C 是可以直接调用的。
想要 Swift 调用 C++ 方法,需要走 Objective-C 中转才行,类似于 Java 调用 C++ 代码需要走 JNI 一样。
反而 Swift 调用 C 方法还要简单一些,不需要 Objective-C 中转,以下就是具体操作详情~
Swift 调用 C 代码
首先定义好 C 语言对应 .h 头文件和 .c 实现文件。
头文件如下:
#ifndef CTest_h
#define CTest_h
#include <stdio.h>
// 定义一个方法
void test();
#endif /* CTest_h */
实现文件如下:
#include "CTest.h"
void test(){
printf("swift call from c\n");
}
内容很简单,就是打印一个字符串而已。
注意,当我们通过 XCode 来创建 C 文件时,会有如下的弹框:
这个弹框非常重要啦,它会帮我们实现 Swift 和 C 之间的链接。
在项目配置里面能看到对应的链接文件说明,在 Swift 编译时会把它编译进去的。
我们要在这个弹框创建的头文件里把上面的 C 代码头文件通过 import 包含进入,也就是实现下面的代码:
#import "CTest.h"
然后就可以在 Swift 中愉快地调用 C 函数啦~~
Swift 里面直接调用 C 语言函数就好啦,也不需要额外 import 什么库了。
Swift 调用 C++ 代码
Swift 调用 C++ 代码和调用 C 代码基本一致,就是要通过 Objective-C 来做一下中转了,如下图所示:
首先还是先创建好对应的 C++ .h 头文件和 .cpp 实现文件。
头文件如下:
#ifndef CppTest_h
#define CppTest_h
#include <iostream>
class CppTest{
public:
void test();
};
#endif /* CppTest_h */
实现文件如下:
#include "CppTest.h"
void CppTest::test(){
printf("swift call from c++\n");
}
重点来了,在 XCode 中创建 Objective-C 文件来做中转,同时要将创建的 .m
文件后缀改成 .mm
,也就是后缀两个 m 的文件,这是告诉 XCode 编译该文件时要用到 C++ 代码。
在中转的 Objective-C 文件代码中实现如下内容:
Objective-C 的头文件声明一个方法:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface CppTestWrapper : NSObject
-(void) testcpp;
@end
NS_ASSUME_NONNULL_END
Objective-C 的 .mm 文件实现该方法:
#import "CppTestWrapper.h"
#import "CppTest.h"
#import <memory>
@implementation CppTestWrapper
-(void)testcpp{
auto sp = std::make_shared<CppTest>();
sp->test();
}
@end
这里用到了 C++ 文件,所以要用 import 包含进来,然后就可以声明并创建 C++ 类了。
接下来要在负责链接的头文件中导入上面的 Objective-C,主要是导入 Objective-C 头文件而不是 C++ 的头文件,这和调用 C 语言方法还是不一样的。
// 调用 C 就导入 C 头文件
#import "CTest.h"
// 调用 C++ 导入 Objective-C 头文件
#import "CppTestWrapper.h"
接下来就可以在 Swift 中调用 Objective-C 从而间接调用 C++ 代码啦。
如上图所示,先是创建了 Objective-C 对象,然后再调用其方法。
通过上述操作就可以愉快地调用 C++ 代码啦~~
以上方案经过实践在 iOS 和 macOS 开发中都可以使用。
知识星球与微信公众号
扫描下面的二维码关注我的微信公众号《音视频开发进阶》,推送更多精彩内容!
欢迎加入 知识星球《音视频与图形图像的那些事》,还有更多的互动回答和知识分享再等你!
添加我的微信 ezglumes 拉你入群一起交流学习~
原创文章,转载请注明来源: iOS开发 - 在 Swift 中去调用 C/C++ 代码
「真诚赞赏,手留余香」
Recommend
-
37
-
45
SERF 中去中心化系统的原理和实现
-
11
2011年前后,和几个同学一起去游泳馆游泳,在去的路上,我问同学A:“你会游泳吗?”,同学A滑稽的回了一句:“我的理论知识还是很扎实的”,这不经意的一句话,引起我们几个同学的哄堂大笑。 当然我们也知道这是同学 A 开...
-
3
“从泥土里来,到白云中去” ...
-
2
当你把你的 iPad 上打造的 app 带到 Mac 中去时,你就给了人们一个机会可以在具备宽大的屏幕、杰出的原生表现和充足的本地存储的 Mac 上享受你的 app。 开始之前的准备 大多数的 iPad app 都适合这种改造,但是一些依赖 Mac 上没有的 iPad...
-
6
把 iPad 上的 app 带到 Mac 中去的上篇取材于 iOS HIG,从大的层面讲述了移植 app 到 Mac 中去的一些设计规范,取材于 WWDC session 的下篇将用更多的示例和图片主要围绕架构、工具栏、布局、排版、颜...
-
1
到 ICARUS 中去 —— 记对 Icarus 主题的使用及微调伊卡洛斯乘风飞跃迷楼,Icarus 倚水谈笑生风写写迁移到 Icarus 后做的一点微小工作大约 16 年左右吧,我开了自己的个人博客,打算记录一下各种事情。从 Wordpress 到 Typecho,最终还是归...
-
3
Linux 之父发话:Rust 将合并到 Linux 5.20 内核中去-51CTO.COM Linux 之父发话:Rust 将合并到 Linux 5.20 内核中去 作者:聆听世界的鱼 2022-06-27 12:44:34 几天前在Linux 基金会...
-
5
从产业中来、到产业中去 京东云多项解决方案亮相2023全球数字经济大会 7月4日至7日,由工业和信息化部、商务部、国家互联网信息办公室、中国科学技术协会、北京市人民...
-
1
《英雄联盟》的12年:从玩家中来,到玩家中去 2023-08-09 •
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK