jextract-25 early-access build (25-jextract+2-4) on JDK 25.0.5+8 against SQLite 3.45.1: 25 functions and 13 constants generated into 4 committed files (the whole header would be 83 files), a small Db wrapper, the four arena kinds used wrongly on purpose, ADDRESS vs C_POINTER zero-length vs unbounded segments and the SIGSEGV from getString on a NULL pointer, sqlite3_open out-parameter, return codes to exceptions, a sqlite3_exec upcall and the VM exit when it throws, the JDK 25 native-access warning and --illegal-native-access=deny, library loading failures, and a JMH benchmark of FFM vs hand-written JNI vs plain Java (indicative only: shared 2-CPU machine). Co-Authored-By: Claude Sonnet 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_017ic4b6Kg9RWSTJzyz6KP9X
70 lines
1.9 KiB
Java
70 lines
1.9 KiB
Java
// Generated by jextract
|
|
|
|
package demo.sqlite;
|
|
|
|
import java.lang.invoke.*;
|
|
import java.lang.foreign.*;
|
|
import java.nio.ByteOrder;
|
|
import java.util.*;
|
|
import java.util.function.*;
|
|
import java.util.stream.*;
|
|
|
|
import static java.lang.foreign.ValueLayout.*;
|
|
import static java.lang.foreign.MemoryLayout.PathElement.*;
|
|
|
|
/**
|
|
* {@snippet lang=c :
|
|
* void (*)(void *)
|
|
* }
|
|
*/
|
|
public final class sqlite3_bind_text$x0 {
|
|
|
|
private sqlite3_bind_text$x0() {
|
|
// Should not be called directly
|
|
}
|
|
|
|
/**
|
|
* The function pointer signature, expressed as a functional interface
|
|
*/
|
|
public interface Function {
|
|
void apply(MemorySegment _x0);
|
|
}
|
|
|
|
private static final FunctionDescriptor $DESC = FunctionDescriptor.ofVoid(
|
|
sqlite3_h.C_POINTER
|
|
);
|
|
|
|
/**
|
|
* The descriptor of this function pointer
|
|
*/
|
|
public static FunctionDescriptor descriptor() {
|
|
return $DESC;
|
|
}
|
|
|
|
private static final MethodHandle UP$MH = sqlite3_h.upcallHandle(sqlite3_bind_text$x0.Function.class, "apply", $DESC);
|
|
|
|
/**
|
|
* Allocates a new upcall stub, whose implementation is defined by {@code fi}.
|
|
* The lifetime of the returned segment is managed by {@code arena}
|
|
*/
|
|
public static MemorySegment allocate(sqlite3_bind_text$x0.Function fi, Arena arena) {
|
|
return Linker.nativeLinker().upcallStub(UP$MH.bindTo(fi), $DESC, arena);
|
|
}
|
|
|
|
private static final MethodHandle DOWN$MH = Linker.nativeLinker().downcallHandle($DESC);
|
|
|
|
/**
|
|
* Invoke the upcall stub {@code funcPtr}, with given parameters
|
|
*/
|
|
public static void invoke(MemorySegment funcPtr, MemorySegment _x0) {
|
|
try {
|
|
DOWN$MH.invokeExact(funcPtr, _x0);
|
|
} catch (Error | RuntimeException ex) {
|
|
throw ex;
|
|
} catch (Throwable ex$) {
|
|
throw new AssertionError("should not reach here", ex$);
|
|
}
|
|
}
|
|
}
|
|
|