Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KMP with non-Kotlin languages (Droidcon NYC 2025)

KMP with non-Kotlin languages (Droidcon NYC 2025)

Kotlin multiplatform is a great way to share new and existing Kotlin code with other platforms. But what about non-Kotlin code? Turns out Kotlin multiplatform can also be a great way to share code from other languages such as Swift, Rust, Zig, C, and more. This talk will show how to adapt code from these other languages into KMP, the restrictions and considerations when doing so, and look at some existing libraries which are doing this today.

Video: coming soon

Avatar for Jake Wharton

Jake Wharton

June 25, 2025
Tweet

More Decks by Jake Wharton

Other Decks in Programming

Transcript

  1. Jake Wharton Jake Wharton Jake Wharton Jake Wharton KMP wi

    th non-Kotlin languages KMP wi th non-Kotlin languages KMP wi th non-Kotlin languages KMP wi th non-Kotlin languages New Yorker / Bettmann / Getty
  2. platfo rmL og("Hey") expect fun platfo rmL og( message: String,

    ) actual fun platfo rmL og( message: String, ) { Log.d(TAG, message) }
  3. platfo rmL og("Hey") expect fun platfo rmL og( message: String,

    ) actual fun platfo rmL og( message: String, ) { NSLog(message) }
  4. platfo rmL og("Hey") expect fun platfo rmL og( message: String,

    ) actual fun platfo rmL og( message: String, ) { console.log(message) }
  5. platfo rmL og("Hey") expect fun platfo rmL og( message: String,

    ) actual fun platfo rmL og( message: String, ) { LOGGER.log(message) }
  6. platfo rmL og("Hey") expect fun platfo rmL og( message: String,

    ) actual fun platfo rmL og(…) {…} actual fun platfo rmL og(…) {…} actual fun platfo rmL og(…) {…} actual fun platfo rmL og(…) {…}
  7. class DateParser Im pl : NaturalLanguageDateParser { fun parse(input: String):

    LocalDate { return // … } } interface NaturalLanguageDateParser { fun parse(input: String): LocalDate }
  8. class DateParser Im pl : NaturalLanguageDateParser { fun parse(input: String):

    LocalDate { return // … } } zipline.bind( name = "nlDateParser", instance = NaturalLanguageDateParser Im pl(), ) interface NaturalLanguageDateParser { fun parse(input: String): LocalDate }
  9. class DateParser Im pl : NaturalLanguageDateParser { fun parse(input: String):

    LocalDate { return // … } } zipline.bind( name = "nlDateParser", instance = NaturalLanguageDateParser Im pl(), ) interface NaturalLanguageDateParser { fun parse(input: String): LocalDate }
  10. class DateParser Im pl : NaturalLanguageDateParser { fun parse(input: String):

    LocalDate { return // … } } zipline.bind( name = "nlDateParser", instance = NaturalLanguageDateParser Im pl(), ) interface NaturalLanguageDateParser { fun parse(input: String): LocalDate } val parser = zipline.take( name = "nlDateParser", )
  11. class DateParser Im pl : NaturalLanguageDateParser { fun parse(input: String):

    LocalDate { return // … } } zipline.bind( name = "nlDateParser", instance = NaturalLanguageDateParser Im pl(), ) interface NaturalLanguageDateParser { fun parse(input: String): LocalDate } val parser = zipline.take( name = "nlDateParser", ) println( parser.parse( "Next Tuesday", ), )
  12. cinterop linking .klib JNI .cpp .so .jar cklib zipline .h

    .c .kt Android cmake zig cc .so .aar kotlinc
  13. kotlinc .kt .c .h .so JNI .h jextract zig cc

    javac JNI .java JNI .c .jar
  14. kotlinc .kt .c .h .so JNI .h jextract zig cc

    javac JNI .java JNI .c .jar kotlinc JDK22 .kt
  15. JNI .h javac JNI .java JNI .c kotlinc JDK22 .kt

    jextract .c .h zig cc .so .jar kotlinc .kt
  16. Designed by Freepik Jake Wharton Jake Wharton Jake Wharton Jake

    Wharton KMP wi th non-Kotlin languages KMP wi th non-Kotlin languages KMP wi th non-Kotlin languages KMP wi th non-Kotlin languages New Yorker / Bettmann / Getty 100% NATURAL F R E S H I N G R E D I E N T S T H I S P R O D U C T I S 100% N A T U R A L F R E S H I N G R E D I E N T S N O A I B U L L S H I T