mirror of
https://github.com/Stone-Red-Code/website.git
synced 2026-09-04 23:44:11 +02:00
Create C-bindings article
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
---
|
||||
authors:
|
||||
- "supergrecko#3434"
|
||||
created_at: "2019/08/23"
|
||||
title: "Creating C bindings with Kotlin/Native"
|
||||
external_resources:
|
||||
- "https://kotlinlang.org/docs/reference/native/c_interop.html"
|
||||
- "https://github.com/JetBrains/kotlin-native/releases"
|
||||
---
|
||||
|
||||
## Interoperability with C
|
||||
|
||||
Kotlin/Native supports interoperability with the C programming language. This article will show you how to create bindings between C and Kotlin/Native.
|
||||
|
||||
### Setup
|
||||
|
||||
This guide assumes you already have the Kotlin compiler and the GCC C compiler installed on your computer.
|
||||
|
||||
If you do not have the Kotlin compiler installed on your computer you can download it from the GitHub releases linked above.
|
||||
|
||||
### Creating our C library
|
||||
|
||||
We will be creating a very simple library to demonstrate linking.
|
||||
|
||||
This is our `App.h` file
|
||||
```c
|
||||
#ifndef APP_H
|
||||
#define APP_H
|
||||
|
||||
void run();
|
||||
|
||||
#endif
|
||||
```
|
||||
|
||||
And this is our `App.c` file
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include "App.h"
|
||||
|
||||
void run() {
|
||||
printf("Hello, from C");
|
||||
}
|
||||
```
|
||||
|
||||
### Compiling our C library
|
||||
|
||||
First of all we will need to compile our C sources.
|
||||
|
||||
```bash
|
||||
gcc -c "-I$(pwd)" App.c -o App.o
|
||||
```
|
||||
|
||||
The `"-I$(pwd)"` flag translates to the gcc -I flag with our current working directory as its parameter. You can also type out the full path if you want to.
|
||||
|
||||
We now have our compiled C code in `App.o`. Now we have to turn the compiled output into a static library.
|
||||
|
||||
We'll save our compiled static library in a file named `App.a`
|
||||
|
||||
```bash
|
||||
ar rcs App.a App.o
|
||||
```
|
||||
|
||||
### Compiling our bindings
|
||||
|
||||
Now we need to create a `App.def` file for the Kotlin cinterop tool
|
||||
|
||||
The minimal requirements for a `.def` file is some headers. We will include our header file here.
|
||||
|
||||
```def
|
||||
headers = App.h
|
||||
```
|
||||
|
||||
We will run the `cinterop` command to generate the Kotlin bindings for our C library.
|
||||
|
||||
```bash
|
||||
cinterop -def App.def -compilerOpts "-I$(pwd)" -o App.klib
|
||||
```
|
||||
|
||||
We're now ready to create a Kotlin file to interact with our C library so let's do that. Let's name this file `App.kt`
|
||||
|
||||
```kotlin
|
||||
import App.run
|
||||
|
||||
fun main() {
|
||||
println("Hello, from Kotlin/Native")
|
||||
run()
|
||||
}
|
||||
```
|
||||
|
||||
We'll print out a hello from Kotlin, and then the hello from C.
|
||||
|
||||
### Executing our Kotlin
|
||||
|
||||
There is only one more step before we can run our Kotlin application, we need to compile our Kotlin, so let's do that.
|
||||
|
||||
Using the konanc compiler we will bundle our C library with our Kotlin file.
|
||||
|
||||
```bash
|
||||
konanc -l App.klib App.kt -linker-options App.a -o App.kexe
|
||||
```
|
||||
|
||||
We can now run our executable so let's do that.
|
||||
|
||||
```bash
|
||||
./App.kexe
|
||||
```
|
||||
|
||||
This should be the program output:
|
||||
```text
|
||||
Hello, from Kotlin/Native
|
||||
Hello, from C
|
||||
```
|
||||
Reference in New Issue
Block a user