【发布时间】:2015-11-20 03:28:58
【问题描述】:
伙计们。 我正在快速编写一个 iOS 应用程序,我需要调用一些 C++ 库。因此,我构建了一个简单的示例,说明如何在 C++ 和 Swift 之间进行桥接,并在 iTouch 上进行测试。我用 extern C 包装了 C++ 接口。但是当我调用 C++ 函数时,我无法读取文件。这是代码。
当我点击iOS设备上的按钮时,它需要调用myFun():
main.swift
@IBAction func button(sender: AnyObject) {
myFun()
}
myFun() 是我的 C++ 函数,它只是读取本地文件(“hi.c”)。
DlibFun.cpp
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include "DlibFun.h"
#include <unistd.h>
void myFun(){
char* path = (char*)"/hi.c";
FILE* f = fopen(path, "r");
if(f != NULL){
printf("open it\n");
fclose (f);
}else{
printf("FAIL\n");
}
}
在 C 中包装 C++ 代码
DlibFun.h
#ifdef __cplusplus
extern "C" {
#endif
int myFun();
#ifdef __cplusplus
}
#endif
photo-Bridging-Header.h
#include "DlibFun.h"
结果是每次都打印出“FAIL”。有人给我任何提示吗?我尝试了不同的路径,但没有一个是正确的。我的路径有可能是错误的吗?还是有什么我不知道的厚实的东西?
【问题讨论】:
-
根目录下有没有叫hi.c的文件?
-
也许你的意思是
char* path = (char*)"./hi.c";(在./中添加了一个点) -
我会再调查一下,但这里的问题似乎是无法打开文件。如果打印了“FAIL”,肯定会调用 myFun()。这看起来是您作为演示编写的一个快速示例,实际项目中的问题可能有所不同。真正的 C++ 库中的函数具有 C++ 链接,您将无法从 Swift 中调用它们。您需要编写一个 C++ 包装器。我在这里有一篇文章:swiftprogrammer.info/swift_call_cpp.html
-
顺便说一句,myFun() 的实现和它的原型有不同的返回类型。我确定这是一个错字。