final class Native {
    static {
        String preferredLibrary = "{{ module.lib_name }}_jni";
        String fallbackLibrary = "{{ module.lib_name }}";
        String vmName = System.getProperty("java.vm.name");
        if (vmName == null) vmName = "";
        boolean isAndroidRuntime =
            vmName.toLowerCase().contains("dalvik") ||
            vmName.toLowerCase().contains("art");
        if (isAndroidRuntime) {
            System.loadLibrary(fallbackLibrary);
        } else {
            System.loadLibrary(preferredLibrary);
        }
    }

    private Native() {}

    @SuppressWarnings("unused")
    static void boltffiFutureContinuationCallback(long handle, byte pollResult) {
    }

    static native void {{ module.prefix }}_free_string(long ptr);
    static native byte[] {{ module.prefix }}_last_error_message();
{%- for func in module.functions %}
    static native {{ func.native_return_type() }} {{ func.ffi_name }}({% for param in func.params %}{{ param.native_type }} {{ param.name }}{% if !loop.last %}, {% endif %}{% endfor %});
{%- endfor %}
}
