1 of 122

Native with�Kotlin/Native

_

Eugene Petrenko

eugene.petrenko@jetbrains.com

@jonnyzzz

JetBrains, @jonnyzzz, JB KTUG SPB 2019

2 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

3 of 122

Now First Class Supported on Android!

JetBrains, @jonnyzzz, JB KTUG SPB 2019

4 of 122

@jonnyzzz

Eugene Petrenko

JetBrains, Kotlin user, PhD, https://jonnyzzz.com

Kotlin, Java, Go, C/C++, Qt, Server-side, Desktop, DSLs!

JetBrains, @jonnyzzz, JB KTUG SPB 2019

5 of 122

Kotlin Targets

JetBrains, @jonnyzzz, JB KTUG SPB 2019

6 of 122

Kotlin/JVM 1.6+

  • 100% Java Interop
  • Mix Java/Kotlin in one module
  • Copy-paste conversion
  • Gradle, Maven, Ant, Command line

JetBrains, @jonnyzzz, JB KTUG SPB 2019

7 of 122

Kotlin/Android

  • Officially Supported
  • Android KTX

JetBrains, @jonnyzzz, JB KTUG SPB 2019

8 of 122

Kotlin/JS

  • Transpile to JavaScript
  • Readable
  • dynamic and JS interop

JetBrains, @jonnyzzz, JB KTUG SPB 2019

9 of 122

Kotlin/Native ❤ LLVM

  • No Virtual Machine!
  • Targets
    • iOS / Android
    • Windows, Linux, Mac
    • Small Devices
  • Native with a higher order language

JetBrains, @jonnyzzz, JB KTUG SPB 2019

10 of 122

No Virtual Machine

JetBrains, @jonnyzzz, JB KTUG SPB 2019

11 of 122

Kotlin/Native Memory

  • Reference Counting with �Cycles collector
  • memScoped { }
    • to allocate native memory

JetBrains, @jonnyzzz, JB KTUG SPB 2019

12 of 122

fun part

JetBrains, @jonnyzzz, JB KTUG SPB 2019

13 of 122

data:image/png;base64,...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

14 of 122

data:image/png;base64,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

JetBrains, @jonnyzzz, JB KTUG SPB 2019

15 of 122

Data URI

  • Embed images into the code
  • <img src=”data:...” />
  • ![](data:...)

JetBrains, @jonnyzzz, JB KTUG SPB 2019

16 of 122

The Screenshot Tool

github icon CC 3.0 BY. : https://www.flaticon.com/free-icon/github-logo_25231

JetBrains, @jonnyzzz, JB KTUG SPB 2019

17 of 122

How it works?

  • Take a screenshot
    • CMD+SHIFT+4 on macOS
  • Run the tool
    • it replaces image with the URI
  • Paste Data URI
    • into markdown or HTML

JetBrains, @jonnyzzz, JB KTUG SPB 2019

18 of 122

Let’s do Native Tool

  • Starts faster
  • Direct access to OS APIs
  • No need for AWT, Swing, Qt, JRE, etc
  • One standalone binary file

JetBrains, @jonnyzzz, JB KTUG SPB 2019

19 of 122

Why Kotlin/Native?

  • A higher order language
  • Code-reuse with other Kotlin code
  • Easy interop with C/Swift/Obj-C
  • Platform independent language

JetBrains, @jonnyzzz, JB KTUG SPB 2019

20 of 122

The Tool Run Example

JetBrains, @jonnyzzz, JB KTUG SPB 2019

21 of 122

macOS API

  • Objective-C/Swift API
  • Clipboard === Pasteboard
    • NSPasteboard
    • NSData

https://developer.apple.com/documentation/appkit/nspasteboard

JetBrains, @jonnyzzz, JB KTUG SPB 2019

22 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

23 of 122

Kotlin/Native

JetBrains, @jonnyzzz, JB KTUG SPB 2019

24 of 122

Kotlin/Native

  • Included into �Kotlin releases as Beta
  • LLVM based
  • No Virtual Machine!

JetBrains, @jonnyzzz, JB KTUG SPB 2019

25 of 122

Produces

  • Executable
  • Static, Dynamic, Shared libraries
  • C, Objective-C/Swift Frameworks
  • klib

JetBrains, @jonnyzzz, JB KTUG SPB 2019

26 of 122

Consumes

  • Static, Dynamic, Shared libraries
    • C include files
  • Framework
    • C, Objective-C include files
    • Swift (via Objective-C interop)
  • klib

JetBrains, @jonnyzzz, JB KTUG SPB 2019

27 of 122

Static vs Shared Libraries

  • C or Objective-C ABI
  • included into the binary
  • loaded at runtime
  • DLL / JAR / SO hell to find a version

JetBrains, @jonnyzzz, JB KTUG SPB 2019

28 of 122

Platform Libraries

  • Kotlin/Native comes with pre-imported popular platform libraries
    • C
    • Objective-C/Swift
  • cinterop
    • to import custom libraries

JetBrains, @jonnyzzz, JB KTUG SPB 2019

29 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

30 of 122

Including�Image Info

JetBrains, @jonnyzzz, JB KTUG SPB 2019

31 of 122

https://twitter.com/ProfFeynman/status/1099030726765363200

JetBrains, @jonnyzzz, JB KTUG SPB 2019

32 of 122

Image Info Example

JetBrains, @jonnyzzz, JB KTUG SPB 2019

33 of 122

Image Info Example

JetBrains, @jonnyzzz, JB KTUG SPB 2019

34 of 122

Did you see a Y2K compliant library?

Year 2000 problem with dates support�We will use one soon :)

JetBrains, @jonnyzzz, JB KTUG SPB 2019

35 of 122

libpng

  • 24 years old C library
    • Y2K compliant
  • Download and Build
    • ./configure && make install --prefix=jo
  • Link static (along with zlib)

http://www.libpng.org/pub/png/libpng.html

JetBrains, @jonnyzzz, JB KTUG SPB 2019

36 of 122

Import with cinterop

  • Import png.h into Kotlin/Native
  • Use Kotlin code next

JetBrains, @jonnyzzz, JB KTUG SPB 2019

37 of 122

The Pipeline

png.h

.klib

*.kt

cinterop

libpng

Kotlin/Native

executable

linker

libz

JetBrains, @jonnyzzz, JB KTUG SPB 2019

38 of 122

libpng from Kotlin/Native

JetBrains, @jonnyzzz, JB KTUG SPB 2019

39 of 122

Powered by libpng

JetBrains, @jonnyzzz, JB KTUG SPB 2019

40 of 122

Loading PNG from Memory

  • libpng defaults to FILE*
  • Configure via� png_set_read_fn function
  • Need a C-function pointer

JetBrains, @jonnyzzz, JB KTUG SPB 2019

41 of 122

png_set_read_fn

JetBrains, @jonnyzzz, JB KTUG SPB 2019

42 of 122

png_set_read_fn

JetBrains, @jonnyzzz, JB KTUG SPB 2019

43 of 122

png_set_read_fn

JetBrains, @jonnyzzz, JB KTUG SPB 2019

44 of 122

png_set_read_fn params

  • png structure pointer
  • void* context
  • function pointer to a reader func�png struct pointer�byte* + size-to-read

JetBrains, @jonnyzzz, JB KTUG SPB 2019

45 of 122

Registering a callback

JetBrains, @jonnyzzz, JB KTUG SPB 2019

46 of 122

C Function Pointer

  • Use staticCFunction { .. }
  • No use local variables inside lambda
  • Kotlin/Native generates the static function

JetBrains, @jonnyzzz, JB KTUG SPB 2019

47 of 122

void* context - Kotlin

JetBrains, @jonnyzzz, JB KTUG SPB 2019

48 of 122

void* context - towards C

JetBrains, @jonnyzzz, JB KTUG SPB 2019

49 of 122

void* context - recover

JetBrains, @jonnyzzz, JB KTUG SPB 2019

50 of 122

The Whole Picture

JetBrains, @jonnyzzz, JB KTUG SPB 2019

51 of 122

PNG Load Completed

  • cinterop to import png.h
  • pass C function pointer to read data from memory
  • use StableRef<T>

JetBrains, @jonnyzzz, JB KTUG SPB 2019

52 of 122

The Pipeline

png.h

.klib

*.kt

cinterop

libpng

Kotlin/Native

executable

linker

libz

JetBrains, @jonnyzzz, JB KTUG SPB 2019

53 of 122

https://twitter.com/ProfFeynman/status/1099030726765363200

JetBrains, @jonnyzzz, JB KTUG SPB 2019

54 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

55 of 122

data:image/png;base64,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

JetBrains, @jonnyzzz, JB KTUG SPB 2019

56 of 122

The Screenshot Tool

github icon CC 3.0 BY. : https://www.flaticon.com/free-icon/github-logo_25231

JetBrains, @jonnyzzz, JB KTUG SPB 2019

57 of 122

C Interop Gems

  • staticCFunction { .. }
  • memScoped { .. }
    • alloc<T> or cValue<T>
  • StableRef<T>

JetBrains, @jonnyzzz, JB KTUG SPB 2019

58 of 122

Project Setup�Tooling

JetBrains, @jonnyzzz, JB KTUG SPB 2019

59 of 122

IDEA Project

  • Gradle Kotlin DSL
  • Standard IDEA features
  • Supported in
    • Android Studio
    • IntelliJ, CLion, AppCode

JetBrains, @jonnyzzz, JB KTUG SPB 2019

60 of 122

Simple Native Executable

JetBrains, @jonnyzzz, JB KTUG SPB 2019

61 of 122

https://github.com/jonnyzzz/kotlin-native-clipboard

JetBrains, @jonnyzzz, JB KTUG SPB 2019

62 of 122

Useful Gradle Tasks

  • Call Gradle from IDE
    • runDebugExecutable<TARGET>
    • runReleaseExecutable<TARGET>

JetBrains, @jonnyzzz, JB KTUG SPB 2019

63 of 122

Template Projects

  • Gradle Kotlin DSL scripts
    • for Multiplatform (MPP)
    • for Kotlin/Native
  • Contribute your templates!

github icon CC 3.0 BY. : https://www.flaticon.com/free-icon/github-logo_25231

JetBrains, @jonnyzzz, JB KTUG SPB 2019

64 of 122

Kotlin multiplatform plugin?

JetBrains, @jonnyzzz, JB KTUG SPB 2019

65 of 122

Multiplatform

  • Share common code
    • Business logic, Utilities, UI-core, DTO
  • Use platform for the rest
    • UI, API, Frameworks

JetBrains, @jonnyzzz, JB KTUG SPB 2019

66 of 122

Multiplatform Kotlin

JetBrains, @jonnyzzz, JB KTUG SPB 2019

67 of 122

JS in JVM�JVM in JS�Native in JS

JetBrains, @jonnyzzz, JB KTUG SPB 2019

68 of 122

Kotlin/Common src

actual & expect

JetBrains, @jonnyzzz, JB KTUG SPB 2019

69 of 122

expect & actual

common

*.kt

expect fun

expect class

...

platform

*.kt

actual fun

actual class

...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

70 of 122

*.kt�

common

expect ...

*.kt, *.java, *.jar

JVM

actual...

*.kt, *.js, NPM

JS

actual...

*.kt, C, Swift, Framework

Native

actual...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

71 of 122

Framework

common

*.kt

expect fun

expect class

...

Kotlin/Native

*.kt

actual fun

actual class

...

compiled

�framework

JetBrains, @jonnyzzz, JB KTUG SPB 2019

72 of 122

What to expect?

JetBrains, @jonnyzzz, JB KTUG SPB 2019

73 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

74 of 122

Kotlin Fractals App

JetBrains, @jonnyzzz, JB KTUG SPB 2019

75 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

76 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

77 of 122

M = Mandelbrot set

https://en.wikipedia.org/wiki/Mandelbrot_set

JetBrains, @jonnyzzz, JB KTUG SPB 2019

78 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

79 of 122

Kotlin

Native

App

Console

JetBrains, @jonnyzzz, JB KTUG SPB 2019

80 of 122

Kotlin

Native

App

iOS

JetBrains, @jonnyzzz, JB KTUG SPB 2019

81 of 122

Template Projects

  • Gradle Kotlin DSL scripts
    • for Multiplatform (MPP)
    • for Kotlin/Native
  • Contribute your templates!

github icon CC 3.0 BY. : https://www.flaticon.com/free-icon/github-logo_25231

JetBrains, @jonnyzzz, JB KTUG SPB 2019

82 of 122

Useful Links

JetBrains, @jonnyzzz, JB KTUG SPB 2019

83 of 122

expect fun

JetBrains, @jonnyzzz, JB KTUG SPB 2019

84 of 122

Q & A

_

tweet me �@jonnyzzz

JetBrains, @jonnyzzz, JB KTUG SPB 2019

85 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

86 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

87 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

88 of 122

Fractals App Parts

  • JVM server
  • JS frontend
  • iOS App
  • Native console app

JetBrains, @jonnyzzz, JB KTUG SPB 2019

89 of 122

Kotlin common code

actual / expect

JetBrains, @jonnyzzz, JB KTUG SPB 2019

90 of 122

Kotlin/Common

  • reuse code between platforms
  • expect and actual keywords
  • Multiplatform (MPP)
    • Projects
    • Libraries

JetBrains, @jonnyzzz, JB KTUG SPB 2019

91 of 122

expected / actual

common

*.kt

expect fun

expect class

...

platform

*.kt

actual fun

actual class

...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

92 of 122

*.kt�

common

expect ...

*.kt, *.java, *.jar

JVM

actual...

*.kt, *.js, NPM

JS

actual...

*.kt, C, Swift, Framework

Native

actual...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

93 of 122

What to expect?

JetBrains, @jonnyzzz, JB KTUG SPB 2019

94 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

95 of 122

Common Libraries

JetBrains, @jonnyzzz, JB KTUG SPB 2019

96 of 122

common

lib

platform

lib-jvm.jar

common

app

platform

app.jar

expect

actual

actual

expect

JetBrains, @jonnyzzz, JB KTUG SPB 2019

97 of 122

Existing libraries

  • kotlin standard library
  • kotlin.test
  • kotlinx.html
  • kotlinx.coroutines
  • ...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

98 of 122

Fractals: Common

  • Requires HSL color impl
  • Provides Renderer, coords

JetBrains, @jonnyzzz, JB KTUG SPB 2019

99 of 122

Expects

expect ...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

100 of 122

Per Platform

  • Implement expect per platform
  • Use actual

JetBrains, @jonnyzzz, JB KTUG SPB 2019

101 of 122

Console App

JetBrains, @jonnyzzz, JB KTUG SPB 2019

102 of 122

App-common: usage/Native

JetBrains, @jonnyzzz, JB KTUG SPB 2019

103 of 122

App-common: expect

expect ...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

104 of 122

Native: actual

actual...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

105 of 122

Native Fractals

common

*.kt

expect fun

expect class

...

native

*.kt

actual fun

actual class

...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

106 of 122

iOS

JetBrains, @jonnyzzz, JB KTUG SPB 2019

107 of 122

Process

  • Use Kotlin project to create �iOS Framework
  • Include the Framework in Xcode
  • Use Swift/Objective-C interop

JetBrains, @jonnyzzz, JB KTUG SPB 2019

108 of 122

iOS Fractals

common

*.kt

expect fun

expect class

...

Kotlin/Native

*.kt

actual fun

actual class

...

compiled

iOS�framework

JetBrains, @jonnyzzz, JB KTUG SPB 2019

109 of 122

JavaScript

JetBrains, @jonnyzzz, JB KTUG SPB 2019

110 of 122

JetBrains, @jonnyzzz, JB KTUG SPB 2019

111 of 122

Tap to Zoom

  • Render in JS/Browser fast
  • JVM-rendered in background

=> responsive, reuse code

JetBrains, @jonnyzzz, JB KTUG SPB 2019

112 of 122

Web Technologies

JetBrains, @jonnyzzz, JB KTUG SPB 2019

113 of 122

Coded in Kotlin

JetBrains, @jonnyzzz, JB KTUG SPB 2019

114 of 122

JVM

JetBrains, @jonnyzzz, JB KTUG SPB 2019

115 of 122

Ktor HTTP server

  • Renders PNG images
  • Implements same `actual`s
  • Uses Netty or Jetty
  • github.com/ktorio/ktor

ktor.io

JetBrains, @jonnyzzz, JB KTUG SPB 2019

116 of 122

Ktor DSL for HTTP routes

ktor.io

JetBrains, @jonnyzzz, JB KTUG SPB 2019

117 of 122

JVM: usage

JetBrains, @jonnyzzz, JB KTUG SPB 2019

118 of 122

JVM: actual - typealias

actual...

JetBrains, @jonnyzzz, JB KTUG SPB 2019

119 of 122

JVM Fractals

common

*.kt

expect fun

expect class

...

Kotlin/JVM

*.kt

*.java

actual fun

actual class

...

compiled�classes

*.class

JetBrains, @jonnyzzz, JB KTUG SPB 2019

120 of 122

Tests

JetBrains, @jonnyzzz, JB KTUG SPB 2019

121 of 122

Tests: app-common

common

JetBrains, @jonnyzzz, JB KTUG SPB 2019

122 of 122

Tests: app-common

  • kotlin.test
  • Similar to JUnit� actual to JUnit on JVM
  • Run on all platforms

kotlin.test

JetBrains, @jonnyzzz, JB KTUG SPB 2019