开始
因为Kotlin native的标准库还不是很完善和成熟,所有有很多东西都得依靠外部例如调用C函数、库等,我就碰到了这个问题, 我现在写了一个Maven仓库服务器用到了Native但是官方的IO API和posixAPI都没有获取文件或者文件夹上次修改时间的API, 所以我就只能转向使用C写个简单的函数来让Kotlin使用于是在尝试+查资料2个小时之后终于成功了,下面是一些小记录
Def文件定义
def文件到目前(2025年4月19日)为止并没有代码提示和补全,所以全靠记忆和资料。
先看一下头文件的写法
headers = E:\\projects\\KMVNRepo\\backend\\src\\cinterop\\include\\file_time.h
有一个坑点就是这个头文件必须是绝对路径不能是相对路径, 这点卡了我好久我才发觉hh
然后就是如果要使用c语言或者其它语言编译出来的静态库.a文件的话得主动写上去这个.a文件的名字和这个库的路径, 这个路径也得是绝对路径
就像下面这样
staticLibraries = libfiletime-linuxx64.a
libraryPaths = E:\\projects\\KMVNRepo\\backend\\src\\cinterop\\libs
下面是一个完整的def文件示例
headers = E:\\projects\\KMVNRepo\\backend\\src\\cinterop\\include\\file_time.h
package = cn.rtast.kmvnrepo.time
staticLibraries = libfiletime-linuxx64.a
libraryPaths = E:\\projects\\KMVNRepo\\backend\\src\\cinterop\\libs
然后在build.gradle.kts里面指定需要为哪个平台创建binding
(也就是自动生成.knm, .knm就是.klib文件内的一个结构文件这个文件里面只有结构并没有具体实现, 具体实现都放到klib内的二进制文件内了, 这个文件就是用来IDE自动补全提示用的)
kotlin {
linuxX64 {
compilations["main"].cinterops {
val fileTimeLinux by creating {
definitionFile = project.layout.projectDirectory.dir("src/cinterop/file_time_linuxx64.def").asFile
compilerOpts("-Isrc/cinterop/")
}
}
}
mingwX64 {
compilations["main"].cinterops {
val fileTimeMingw by creating {
definitionFile = project.layout.projectDirectory.dir("src/cinterop/file_time_mingwx64.def").asFile
compilerOpts("-Isrc/cinterop/")
// 这里的src/cinterop就是def文件放的位置
}
}
}
}
最后在IDEA里面sync一下就可以发现build/libs/里面有自动生成的klib文件了然后就可以使用自动生成的C函数binding了
再提一嘴: 最好在commonMain创建一个expect函数然后在每个target actual这个函数这样才能使用各自平台的C binding
1.本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:[email protected],工作室将第一时间处理!
2.资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。
3.所有资源仅限于参考和学习,版权归原作者所有。