加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift:如何调用从dylib加载的C函数

发布时间:2020-12-14 05:44:41 所属栏目:百科 来源:网络整理
导读:有没有办法调用从Swift的dylib加载的C函数? 这是我的dylib文件: cppdemofile.cpp #include "cppdemofile.h"int add(int a,int b) { return a + b;} cppdemofile.h #ifndef __CppDemoLibrary__cppdemofile__#define __CppDemoLibrary__cppdemofile__#pragma
有没有办法调用从Swift的dylib加载的C函数?

这是我的dylib文件:

cppdemofile.cpp

#include "cppdemofile.h"

int add(int a,int b) {
    return a + b;
}

cppdemofile.h

#ifndef __CppDemoLibrary__cppdemofile__
#define __CppDemoLibrary__cppdemofile__

#pragma GCC visibility push(default)

extern "C" int add(int a,int b);

#pragma GCC visibility pop

#endif

编译成dylib并检查:

nm -gU libCppDemoLibrary.dylib
0000000000000f80 T _add

…将libCppDemoLibrary.dylib复制到?/ lib …

Swift程序:

@IBAction func buttonClick(sender: NSButton) {
    let handle = dlopen("libCppDemoLibrary.dylib",RTLD_NOW)
    if (handle != nil) {
        var sym = dlsym(handle,"add")
        if (sym != nil) {
            let pointer = UnsafeMutablePointer<(CInt,CInt) -> CInt>(sym)

            // When debugging,I'm reaching up to this point...
            // but now,how do I call the 'add' function here???
            // var result = ???

            // label.stringValue = "Total: " + String(result)
        }
    }
}

如何调用add函数?可以使用dylib吗?我应该将这些来源添加到我的快速项目吗?

从Swift调用add函数是可能的,因为你
将其定义为与extern“C”具有C链接.

使库成为Swift模块(如上面的jtbandes所示)
评论)可能是更好的解决方案,
但是这里是如何使用来自Swift的dlsym()返回的函数指针:

首先添加

typedef int(*addFunc)(int,int);

到桥接头文件,或者定义

typealias addFunc = @convention(c) (CInt,CInt) -> CInt

在斯威夫特.然后以下工作:

let handle = dlopen(path,RTLD_NOW)
if (handle != nil) {
    var sym = dlsym(handle,"add")
    if (sym != nil) {
        let f = unsafeBitCast(sym,addFunc.self)
        let result = f(12,45)
        print(result)
    }
    dlclose(handle)
}

当然,如果addFunc与之匹配,这将会崩溃
加载函数的实际签名.

Swift 3的更新:

if let handle = dlopen(path,RTLD_NOW) {
    if let sym = dlsym(handle,"add") {
        let f = unsafeBitCast(sym,to: addFunc.self)
        let result = f(12,45)
        print(result)
    }
    dlclose(handle)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读