jaylib icon indicating copy to clipboard operation
jaylib copied to clipboard

[Proposal] Use GraalVM nativeimage

Open electronstudio opened this issue 4 years ago • 1 comments

There are two ways to do this:

  1. With the Jaylib bindings.

Problem: All the JNI method calls need to be listed in a file META-INF/native-image/jni-config.json. This file can be generated by the 'native-image-agent' but it's very incomplete. So someone would have to manually add every JNI call which seems a pretty big job.

  1. Make new bindings that don't use JNI.

There's a nice example of this here: https://github.com/praj-foss/opengl-graal-examples

Seems like it should be very fast. But it will only ever work with GraalVM in nativeimage mode which might limit how many people would want to use it. Is there a tool to autogenerate these or are we back to having to do it manually?

electronstudio avatar Sep 29 '21 13:09 electronstudio

I got (1) working. To generate the jni-config use:

$GRAALVM_HOME/bin/java -agentlib:native-image-agent=config-output-dir=META-INF/native-image,no-builtin-caller-filter -jar jaylib-example-project-1.0-SNAPSHOT-all.jar

Then edit reflect-config.json and add these extra fields to every entry:

{
  "name":"com.raylib.Raylib$Texture",
  "allDeclaredFields":true,
  "allPublicConstructors" : true,
  "allPublicFields": true,
  "allDeclaredMethods": true,
  "allPublicMethods": true
},

The native-image.properties should contain:

Args = --no-fallback --allow-incomplete-classpath

However in the end the performance is pretty poor, so no point in this approach for performance. (Might be if you have some other reason like wanting to run on iOS where you cant run JIT.)

electronstudio avatar Sep 29 '21 14:09 electronstudio