SN Bindgen is a set of tools to generate Scala Native bindings for C libraries from header files.
It comes in the form of a standalone CLI binary and a SBT plugin, both of which can generate comprehensive Scala 3 Native definitions from C header files.
Head on over to Quick start to see how to use this project
Check out Motivation to see why I think this project is useful
See Semantics for detailed description of what is generated, how it behaves, and and how C definitions are interpreted
Visit Limitations to see what the generator currently cannot do and what is required to overcome those difficulties
In Configuration you can see what options are available both in CLI and in the SBT plugin
As a motivating example, here's a program written with bindings to Raylib, running on Apple M1.
import libraylib.functions.*
import libraylib.types.*
import scala.scalanative.unsafe.*
import scala.scalanative.unsigned.*
@main def hello_raylib =
val screenWidth = 800
val screenHeight = 450
InitWindow(
screenWidth,
screenHeight,
c"hello raylib from Scala Native"
)
Zone { implicit z =>
val WHITE = Color(255.toUByte, 255.toUByte, 255.toUByte, 255.toUByte)
val GREEN = Color(0.toUByte, 255.toUByte, 0.toUByte, 255.toUByte)
val BLUE = Color(0.toUByte, 0.toUByte, 255.toUByte, 255.toUByte)
val BLACK = Color(0.toUByte, 0.toUByte, 0.toUByte, 255.toUByte)
val redBallPosition = Vector2(screenWidth / 2, screenHeight / 2)
val blueBallPositionPtr = Vector2(0, 0)
val blueBallPosition = !blueBallPositionPtr
SetTargetFPS(200)
var i = 0
while !WindowShouldClose() do
!redBallPosition = GetMousePosition()
BeginDrawing()
import KeyboardKey.*
if IsKeyDown(KEY_RIGHT.int) then blueBallPosition.x += 2.0f;
if IsKeyDown(KEY_LEFT.int) then blueBallPosition.x -= 2.0f;
if IsKeyDown(KEY_UP.int) then blueBallPosition.y -= 2.0f;
if IsKeyDown(KEY_DOWN.int) then blueBallPosition.y += 2.0f;
ClearBackground(!WHITE)
DrawText(
c"Red ball will follow your pointer,\n move blue with arrow keys",
10,
10,
20,
!BLACK
)
DrawCircleV(!redBallPosition, 50, !GREEN)
DrawCircleV(blueBallPosition, 20, !BLUE)
EndDrawing()
end while
CloseWindow()
}
end hello_raylib