您的位置:首页 > 移动开发 > Swift

swift 调用 C语言库

2016-06-15 18:54 549 查看
     目前了解到两种调用C语法方法方式:这里以系统中自带的“/usr/include/CommonCrypto/CommonCrypto.h”为例

一: 使用桥接文件。
     创建一个桥接文件xxx.h,然后在Build setting 中 “Objective-C Bridging Header” 中添加刚刚创建的xxx.h文件,例如:

然后在将需要使用的头文件名写入xxx.h文件就可以在swift中调用,此方法不近适用于C语言,同样适用于OC。例如:

二:使用swift的module。
    1. 首先在工程中创建一个Group,在Group中创建一个Empty文件,命名为module.modulemap或者module.map。
    2.在其中填写如下内容(注释内容不需要):

module CommonCrypto [system] {
    header"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/CommonCrypto/CommonCrypto.h"

    ///usr/include/CommonCrypto/CommonCrypto.h" //识别不了这个路径

    //link "CommonCrypto" //不要添加这句

    export *
}

注意
网上有一部分例子中header使用的是"/usr/include/CommonCrypto/CommonCrypto.h"
但是这个路径不全,找不到相关API的。
也有的例子添加了link 这个属性,但是这个属性会造成如下错误:

    3. 添加上述内容完成之后,需要在Build setting 中的Import Paths 选项中填写:module map的路径,如下:

     完成上述步骤之后,在需要使用的swift文件中,import
CommonCrypto 之后,就可以在在swift语言中使用CommondCrypto.h中的API了。例如:
import CommonCrypto
class DEScode:NSObject
{
   /**
     DES加密
    */
   classfunc
encryptionDES(text:String, key:String, iv:String)
-> String?

    {

        let data = (textasNSString).dataUsingEncoding(NSUTF8StringEncoding)

        if data !=nil {

            let operation:CCOperation =UInt32(kCCEncrypt)

            let algoritm:CCAlgorithm =UInt32(kCCAlgorithmDES)

            let options:CCOptions =UInt32(kCCOptionECBMode
+kCCOptionPKCS7Padding)

            let keyData = (keyasNSString).dataUsingEncoding(NSUTF8StringEncoding)!asNSData

            let keyLength =size_t(kCCKeySizeDES)

            let ivData = (ivasNSString).dataUsingEncoding(NSUTF8StringEncoding)!asNSData

            let outData =NSMutableData(length:Int(data!.length)
+kCCBlockSizeDES)!

            var numBytesEncrypted:size_t =0
           let cryptStatus =CCCrypt(operation,
algoritm, options, keyData.bytes, keyLength, ivData.bytes,
data!.bytes, data!.length, outData.mutableBytes,
outData.length, &numBytesEncrypted)
           ifUInt32(cryptStatus)
== UInt32(kCCSuccess) {

                outData.length =Int(numBytesEncrypted)
               Log.d("outDataLength
= \(numBytesEncrypted), outData =\(outData)") 
      
               let
base64String = outData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)

                Log.d("base64String=\(base64String)")

                return base64String

            }

            else {

                Log.d("encodeDES
error: \(cryptStatus)")

            }

        }

        returnnil
    }
}

以上。
参考地址:
【1】https://spin.atomicobject.com/2015/02/23/c-libraries-swift/
【2】http://stackoverflow.com/questions/25248598/importing-commoncrypto-in-a-swift-framework#
【3】http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  swift c语言 module