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/
一: 使用桥接文件。
创建一个桥接文件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/
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Apple Swift学习教程
- 介绍 Fedora 上的 Swift
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方