前言

在开发跨平台软件时候,有部分库使用了C++进行编写,该库最终编译成*.dylib形式,如果在iOS或者macOS中使用Swift进行使用,需要使用Objective-C进行桥接。

Swift连接Objective-C

  • 新建Swift项目,Console即可,方便用于测试。
  • 在项目中新建*.m文件,新建该文件XCode会弹出新建Bridge的窗口,点击是即可,会自动生成Bridge的相关文件。
  • 编写Objective-C代码

    // Bridge.h
    #import <Foundation/Foundation.h>
    @interface MyObject : NSObject
    @property (strong, nonatomic) id someProperty;
     - (void) someMethod;
    @end

    编写实现文件

    @implementation MyObject 
     - (void) someMethod {
      NSLog(@"someMethod invoke");
    }
    @end
  • Swift中引用

    // main.swift
    import Foundation
    var myObj = MyObject()
    myObj.someMethod() //<== print "someMethod invoke"
  • 加载*.dylib
    Swift中使用dylib可以通过Objective-C进行衔接,假设此处编译出libTest.dylib,在Objective-C中加载该库:

    #import <Foundation/Foundation.h>
    #import <dlfcn.h>
    #import "myObject.h"
    
    typedef void (*PFN_someMethod)();
    
    int main(){
      void* handle = dlopen("/path/to/file.dylib",RTLD_LAZY);
      
      if(handle == NULL){
          printf("Load dylib failed: %s", dlerror());
          return 0;
      }
      
      PFN_someMethod someMethod = dlsym(handle,"someMethod");
      
      // invoke
      someMethod();
      
      return 0;
    }
    
  • 在iOS中加载dylib
    以上演示了Swift如何通过Objective-C链接dylib的方式,那么如何嵌入dylib到iOS程序呢,可以按照以下路径进行的导入:
    Project -> Build Phases -> Embed Libraries点击+即可进行选取导入。

iOS上架

iOS上架不允许直接使用dylib的库,需要使用framework的模版生成相关库文件。

结语

本次演示了如何在iOS程序中加载编译的dylib,该方式可以方便的引用已有的代码。

引用

https://developer.apple.com/documentation/swift/importing-objective-c-into-swift

最后修改:2024 年 05 月 05 日
如果觉得我的文章对你有用,请随意赞赏