记录一下Kotlin CInterop的使用

内容目录

开始

因为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.所有资源仅限于参考和学习,版权归原作者所有。

Kotlin学习默认

记录一下在Kotlin Native上嵌入资源的插件开发过程

2025-4-16 22:00:57

默认

记录一下使用Compose multiplatform for web的使用

2025-3-11 22:29:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索