開發(fā)工具
- IntelliJ IDEA 2019或 Clion 2019
創(chuàng)建工程
- 新建工程的部分請(qǐng)參考上一篇文章,這里偷個(gè)懶潦匈,依舊使用上一篇的工程
- 新建完成后修改build.gradle的配置,將kotlin->mingwX64->binaries中executable部分注釋掉爸舒,改為
kotlin {
// For ARM, should be changed to iosArm32 or iosArm64
// For Linux, should be changed to e.g. linuxX64
// For MacOS, should be changed to e.g. macosX64
// For Windows, should be changed to e.g. mingwX64
mingwX64("mingw") {
binaries {
/*executable {
// Change to specify fully qualified name of your application's entry point:
entryPoint = 'sample.main'
// Specify command-line arguments, if necessary:
runTask?.args('')
}*/
sharedLib {
baseName = "kotlinlib"
}
}
}
sourceSets {
// Note: To enable common source sets please comment out 'kotlin.import.noCommonSourceSets' property
// in gradle.properties file and re-import your project in IDE.
mingwMain {
}
mingwTest {
}
}
}
編譯動(dòng)態(tài)庫
- 接下來修改SampleMingw.kt
package sample
object Object {
val field = "A"
}
class Clazz {
fun memberFunction(p: Int): ULong = 42UL
}
fun forIntegers(b: Byte, s: Short, i: UInt, l: Long) {
println("Byte is: $b")
println("Short is: $s")
println("UInt is: $i")
println("Long is: $l")
}
fun forFloats(f: Float, d: Double) {
println("Float is $f")
println("Double is $d")
}
fun strings(str: String): String? {
return "That is '$str' from C"
}
val globalString = "A global String"
-
然后雙擊Ctrl尼斧,輸入gradle linkReleaseSharedMingw岔擂,回車Run Anything
-
這是build目錄的文件窟蓝,可以看到生成了頭文件摩瞎、動(dòng)態(tài)鏈接庫和一個(gè)def文件build
-
這是導(dǎo)出的頭文件kotlinlib_api.h
使用生成的動(dòng)態(tài)庫
-
使用Clion新建一個(gè)C++項(xiàng)目新建項(xiàng)目
-
將上面生成的頭文件和dll文件拷貝到工程中,目錄結(jié)構(gòu)如圖工程結(jié)構(gòu)
- 修改CMakeLists.txt纹份,增加兩行代碼
link_directories(lib)
和target_link_libraries(invokekotlindll kotlinlib.dll)
cmake_minimum_required(VERSION 3.14)
project(invokekotlindll)
set(CMAKE_CXX_STANDARD 11)
#指定lib目錄
link_directories(lib)
add_executable(invokekotlindll main.cpp)
target_link_libraries(invokekotlindll kotlinlib.dll)
- 修改main.cpp
#include <iostream>
#include "kotlinlib_api.h"
int main() {
kotlinlib_ExportedSymbols *lib = kotlinlib_symbols();
lib->kotlin.root.sample.forIntegers(1, 2, 3, 4);
lib->kotlin.root.sample.forFloats(1.0f, 2.0);
const char *str = "Hello from Native!";
const char *response = lib->kotlin.root.sample.strings(str);
printf("in: %s\nout:%s\n", str, response);
lib->DisposeString(response);
kotlinlib_kref_sample_Clazz newInstance = lib->kotlin.root.sample.Clazz.Clazz();
long x = lib->kotlin.root.sample.Clazz.memberFunction(newInstance, 42);
lib->DisposeStablePointer(newInstance.pinned);
printf("DemoClazz returned %ld\n", x);
return 0;
}
-
修改項(xiàng)目運(yùn)行配置修改配置
將lib目錄添加到PATH -
然后就可以運(yùn)行項(xiàng)目了運(yùn)行結(jié)果