这里依然使用上一篇kotlin-native03 调用c静态库中的simplelib,只是新建工程的时候将Library type改为shared(或者直接在上一篇的项目中更改CMakeList.txt, 在add_library中将STATIC改为SHARED)
cmake_minimum_required(VERSION 3.14)
project(simplelib C)
set(CMAKE_C_STANDARD 99)
add_library(simplelib SHARED simplelib.c simplelib.h)
simplelib.h, simplelib.c和上一篇文章的一样
-
编译项目,得到libsimple.dll
正式开始
-
将.h文件和.dll文件拷贝到新建的kotlin-native工程中,项目结构如下
- 首先是编写simplelib.def文件。同上个工程一样,def文件放置于src/nativeInterop/cinterop路径下(kotlin-multiplatform默认的def文件路径,也可以在build.gradle.kts中指定这个路径(mingwX64->cpmlilations["main"].cinterops->
yourInteropFileName
->defFile(project.file(relativePathToTheDefFile
))))
headers = simplelib/simplelib.h
headerFilter = simplelib/*
linkerOpts = lib/libsimplelib.dll
- 注意这里添加的linkerOpts,指定dll文件的位置,不然编译会报错
- 然后是build.gradle.kts文件(Clion更新之后的gradle脚本默认就是kts了)
plugins {
kotlin("multiplatform") version "1.3.41"
}
repositories {
mavenCentral()
}
kotlin {
mingwX64("tryagain") {
compilations["main"].cinterops {
val simplelib by creating {
includeDirs.headerFilterOnly("include")
packageName("simplelib")
}
}
binaries {
executable("tryagain") {
entryPoint = "cn.hohov.main"
}
}
}
}
- 接下来就是Hello.kt代码了
package cn.hohov
import platform.posix.system
import simplelib.*
import kotlinx.cinterop.toKString
fun main() {
hello()
println(getString()?.toKString())
system("pause")
}
-
gradle build, 得到tryagain.exe, 我们将libsimplelib.dll拷贝到这个目录下,就可以双击执行了