kotlin-native04 调用c动态库

这里依然使用上一篇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


    libsimplelib.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拷贝到这个目录下,就可以双击执行了


    执行结果

你可能感兴趣的:(kotlin-native04 调用c动态库)