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

Swift:如何调用从dylib加载的C函数,第1张

概述有没有办法调用从Swift的dylib加载的C函数? 这是我的dylib文件: cppdemofile.cpp #include "cppdemofile.h"int add(int a, int b) { return a + b;} cppdemofile.h #ifndef __CppDemoLibrary__cppdemofile__#define __CppDemoLib 有没有办法调用从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.dylib0000000000000f80 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)}
总结

以上是内存溢出为你收集整理的Swift:如何调用从dylib加载的C函数全部内容,希望文章能够帮你解决Swift:如何调用从dylib加载的C函数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1048345.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存