kotlin-native03 調(diào)用c靜態(tài)庫

準備工作: 寫一個c語言的庫

  • CLion新建C靜態(tài)庫工程


    新建工程

simplelib.h

void hello(void);

char *getString(void);

simplelib.c

#include "simplelib.h"

#include <stdio.h>

void hello(void) {
    printf("Hello, World!\n");
}

char *getString() {
    return "string from c library";
}
  • 編譯項目,得到libsimplelib.a文件


    編譯項目

正式開始

  • 新建Kotlin Native項目煤痕,我這里換了IDEA,CLion也可以
  • 我們新建一個cinterop文件夾疗韵,將剛才項目中生成的靜態(tài)庫和頭文件拷貝過來


    拷貝頭文件和靜態(tài)庫
  • 然后在src目錄中新建nativeInterop目錄,在里面新建cinterop目錄,在里面新建interop.def文件(這是gradle插件默認找.def文件的位置)


    interop.def
  • 然后我們編輯.def文件,
libraryPaths = D:\\Workplace\\kotlin\\kandc\\interop\\
headers = D:\\Workplace\\kotlin\\kandc\\interop\\simplelib.h
staticLibraries = libsimplelib.a
  • 同時編輯build.gradle耻卡,在kotlin->mingwX64中加入compilations.main.cinterops { interop },下面是完整的build.gradle文件
plugins {
    id 'kotlin-multiplatform' version '1.3.31'
}
repositories {
    mavenCentral()
}
kotlin {
    mingwX64("mingw") {
        compilations.main.cinterops {
            interop
        }
        binaries {
            executable {
               entryPoint = 'sample.main'
                runTask?.args('')
            }
        }
    }
    sourceSets {
        mingwMain {
        }
        mingwTest {
        }
    }
}
  • 現(xiàn)在可以編譯項目了牲尺,老規(guī)矩,double ctrl幌蚊, 輸入gradle build谤碳,回車
build
  • 編譯完成后可以發(fā)現(xiàn)project面板的External Libraries里面多了一項,這就是kotlin native根據(jù).def文件生成的溢豆,原始文件在build目錄中蜒简,現(xiàn)在我們可以在kotlin代碼里面調(diào)用c寫的靜態(tài)庫了
  • 打開SampleMingw.kt,擼代碼
package sample

import interop.*
import kotlinx.cinterop.toKString

fun main() {
    hello()
    println(getString()?.toKString())
}

運行

  • 老規(guī)矩漩仙,雙擊ctrl搓茬,跑起來


    gradle run

    結果,有點奇怪這里是輸出順序是反的


    結果
編譯后的程序
  • 試試命令行運行
運行exe

和第一篇一樣队他,加上system("pause")卷仑,就可以雙擊運行了

package sample

import interop.*
import kotlinx.cinterop.toKString
import platform.posix.system

fun main() {
    hello()
    println(getString()?.toKString())
    system("pause")
}
雙擊運行

說明

  • 因為是靜態(tài)庫,庫就直接編譯到最后的可執(zhí)行文件中了
  • simplelib中getString()函數(shù)返回的是char *類型麸折,這個在kotlin native中被映射為kotlinx.cinterop.CPointer<ByteVar>?的可空類型锡凝,調(diào)用toKString()將該類型轉換為kotlin中的String?
  • 建立.def文件是為了使用kotlin native的cinterop命令將c語言的頭文件編譯成kotlin native可以識別的klib庫,這個kandc-cinterop-interop.klib就是cinterop編譯出來的文件
    kandc-cinterop-interop.klib

    這是0_interop.knm文件的內(nèi)容
// IntelliJ API Decompiler stub source generated from a class file
// Implementation of methods is not available

package interop

public fun getString(): kotlinx.cinterop.CPointer<kotlinx.cinterop.ByteVar /* = kotlinx.cinterop.ByteVarOf<kotlin.Byte> */>? { /* compiled code */ }

public fun hello(): kotlin.Unit { /* compiled code */ }

@kotlin.native.SymbolName private external fun kniBridge0(): kotlin.Unit { /* compiled code */ }

@kotlin.native.SymbolName private external fun kniBridge1(): kotlinx.cinterop.NativePtr /* = kotlin.native.internal.NativePtr */ { /* compiled code */ }

所以寫kotlin native代碼時就可以調(diào)用這些數(shù)據(jù)/函數(shù)了

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垢啼,一起剝皮案震驚了整個濱河市窜锯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芭析,老刑警劉巖锚扎,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異馁启,居然都是意外死亡驾孔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來助币,“玉大人来屠,你說我怎么就攤上這事○睦眨” “怎么了拐格?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長俭缓。 經(jīng)常有香客問我克伊,道長,這世上最難降的妖魔是什么华坦? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任愿吹,我火速辦了婚禮,結果婚禮上惜姐,老公的妹妹穿的比我還像新娘犁跪。我一直安慰自己,他們只是感情好歹袁,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布坷衍。 她就那樣靜靜地躺著,像睡著了一般条舔。 火紅的嫁衣襯著肌膚如雪枫耳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天孟抗,我揣著相機與錄音迁杨,去河邊找鬼。 笑死凄硼,一個胖子當著我的面吹牛铅协,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帆喇,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼警医,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坯钦?” 一聲冷哼從身側響起预皇,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婉刀,沒想到半個月后吟温,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡突颊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年鲁豪,在試婚紗的時候發(fā)現(xiàn)自己被綠了潘悼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡爬橡,死狀恐怖治唤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情糙申,我是刑警寧澤宾添,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站柜裸,受9級特大地震影響缕陕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疙挺,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一扛邑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铐然,春花似錦蔬崩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至险掀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湾宙,已是汗流浹背樟氢。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侠鳄,地道東北人埠啃。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像伟恶,于是被迫代替她去往敵國和親碴开。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容