The tool generates Scala Native bindings from C headers.
Documentation can be found at scala-native.github.io/scala-native-bindgen.
- possibility to reuse types from existing bindings.
- type casts that make recursive structs be valid Scala Native structs.
- implicit classes for structs and unions that make fields access easier.
- implicit classes that add setters and getters to structs with more than 22 fields (such structs in Scala Native are represented as arrays of bytes).
- literal defines embedding
#define MY_CONSTANT 42
→val MY_CONSTANT: native.CInt = 42
. - read-only bindings for extern variables (such variables cannot be updated due to Scala Native limitation).
- declarations filtering by prefix.
struct point { float x; float y; }; struct vector { struct point a; struct point b; }; struct vector *add(struct vector *v1, struct vector *v2);
import scala.scalanative._ import scala.scalanative.native._ @native.link("vector") @native.extern object vector { type struct_point = native.CStruct2[native.CFloat, native.CFloat] type struct_vector = native.CStruct2[struct_point, struct_point] def add(v1: native.Ptr[struct_vector], v2: native.Ptr[struct_vector]): native.Ptr[struct_vector] = native.extern object implicits { implicit class struct_point_ops(val p: native.Ptr[struct_point]) extends AnyVal { def x: native.CFloat = !p._1 def x_=(value: native.CFloat): Unit = !p._1 = value def y: native.CFloat = !p._2 def y_=(value: native.CFloat): Unit = !p._2 = value } implicit class struct_vector_ops(val p: native.Ptr[struct_vector]) extends AnyVal { def a: native.Ptr[struct_point] = p._1 def a_=(value: native.Ptr[struct_point]): Unit = !p._1 = !value def b: native.Ptr[struct_point] = p._2 def b_=(value: native.Ptr[struct_point]): Unit = !p._2 = !value } } object struct_point { import implicits._ def apply()(implicit z: native.Zone): native.Ptr[struct_point] = native.alloc[struct_point] def apply(x: native.CFloat, y: native.CFloat)(implicit z: native.Zone): native.Ptr[struct_point] = { val ptr = native.alloc[struct_point] ptr.x = x ptr.y = y ptr } } object struct_vector { import implicits._ def apply()(implicit z: native.Zone): native.Ptr[struct_vector] = native.alloc[struct_vector] def apply(a: native.Ptr[struct_point], b: native.Ptr[struct_point])(implicit z: native.Zone): native.Ptr[struct_vector] = { val ptr = native.alloc[struct_vector] ptr.a = a ptr.b = b ptr } } }
This project is distributed under the Scala license. See LICENSE.txt for details