NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1573 most downloaded on pub.dev
A Dart bindings generator for Java and Kotlin that uses JNI under the hood to interop with Java virtual machine.
Last release 7 days ago
01 Oct 2026
Release timing varies
gaps range from 1 weeks to 6 months
Nearly every release is documented
notes for 29 of 29 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
29 releases · first in 2022
One column per quarter.
The YAML configuration format is deprecated and will be removed in a future release.
classes in the config file as a config errorBreaking Change: Restructured Dart Config API to align with package:ffigen. The YAML format has not changed.
Config API to align with
package:ffigen. The YAML format has not changed.
Config class to JniGenerator, matching FFIgen's approach.generateJniBindings is now an extension method on JniGenerator called
generate.classes, sourcePath, classPath, summarizerOptions,
mavenDownloads, and androidSdkConfig into Input.import and hide into SymbolImports, which lives in
Input.imports.OutputConfig renamed to Output, and still contains
dartConfig -> dart and symbolsConfig -> symbols. Now also contains
preamble, generateStubs, and format.DartCodeOutput renamed to DartOutput.nonNullAnnotations and nullableAnnotations now grouped under
NullabilityAnnotations.isExcluded to isIncluded.experiments configuration property.logLevel from the config, and instead pass a Logger object to
the generate function.String paths to Uri.java -jar ApiSummarizer.jar via the
summarizer.command field in config.Breaking Change (technically breaking, but unlikely to affect any users): elements.dart is no longer exported from the library, as these classes were…
create methods.flutter build apk before running JNIgen in
a Flutter project.dart format failures by explicitly searching for the
correct Dart executable to run.JObject (behind a generateStubs config flag).Config.importedClasses and
Config.importClasses() have also been made private.@deprecated Javadoc messages in generated Dart
@Deprecated annotations.package:package_config.Breaking Change: All Java wrapper classes have been migrated to extension types. The main effects are:
JType classes, only JType classes, and the JType
class is simplified.JType in many cases where it
used to be required.Future.bool.Unit) now return
Future<void> in Dart instead of Future<JObject>.Breaking Change: Removed exclude from config.
exclude from config.Breaking Change: Throw when output folder contains non JNIgen files. Users with existing package bindings will need to delete them once to fix the A f…
A file that was not generated by JNIgen was found in ... error.factory can now also be used in a method name without renaming.java.core) module without
providing the class path.build.gradle.kts
instead of build.gradle.Added support for generating matching Kotlin operators as Dart operators.
GradleTools) in lieu of Maven
(MavenTools).bin\download_maven_jars.dart to use GradleTools.Fixed a bug where the source parser would not have all of the type paremeters of the types.
Fixed a bug where Kotlin wildcards would crash the code generation.
Breaking Change(#1516): Inner classes are now generated as OuterClass$InnerClass.
OuterClass$InnerClass.package:jni instead of the path dependency.Now excludes invalid identifiers by default.
bin/jnigen is run.Support implementing generic functions in interfaces.
Breaking Change(#1530): Changed the renaming strategy for method overloadings. Instead of adding a numeric suffix, we add a dollar sign ($) and then t…
$) and then the numeric suffix. This
is done to avoid name collision between methods that originally end with
numeric suffices and the renamed overloads. Similarly names that are Dart
keywords get a dollar sign suffix now. For more information, check out the
documentation.Impl suffix from the generated
implemenation classes. So the implementation class for an interface named
Foo is now simply called $Foo instead of $FooImpl.JImplementer which enables building an object that implements multiple
Java interfaces. Each interface now has a static implementIn method that
takes a JImplementer and the implementation object._) and making them
public by prepending a dollar sign.protected elements.No changes. Keep major version in sync with package:jni.
package:jni.Added backticks to code references in doc comments.
Added support for Kotlin's top-level functions and fields.
package:dart_flutter_team_lints.Fixed a bug where wrong argument types were generated for varargs.
Fixed a bug where wrong argument types were generated for 32-bit architectures. This temporarily breaks generated bindings for macOS arm64, until the
Fixed a bug in summarizer where standard output would use the default encoding of the operating system and therefore breaking the UTF-8 decoding for s
Breaking Change (#660): Removed C-based bindings. Now all bindings are Dart-only.
package:cli_config to allow ^0.2.0.use_super_parameters lint in generated files.Breaking Change: The generated impl class for interfaces is now an interface.
fromRef is now fromReference, and it gets a JReference instead of a
Pointer<Void>.JObject in
package:jni's changelog.interface.static final String fields get converted to JString getters instead of
static const String fields in Dart.<clinit> (class initialization method) which is not
necessary to be exposed was generated.Breaking Change (#563): Added JBuffer and JByteBuffer classes as default classes for java.nio.Buffer and java.nio.ByteBuffer respectively.
JBuffer and JByteBuffer classes as default classes for
java.nio.Buffer and java.nio.ByteBuffer respectively.final.ignore_for_file: lines_longer_than_80_chars to the generated file
preamble.<Interface>.implement code to allow
dart analyze to pass when strict-casts is set.Breaking Change (#707): Renamed delete* to release*.
delete* to release*.ctor1, ctor2, ... to new1, new2, ...suspend_fun_to_async flag from the config. It's
now happening by default since we read the Kotlin's metadata and reliably
identify the suspend funs.enable_experiment option to config.interface_implementation which creates a
.implement method for interfaces, so you can implement them using Dart..dart_tool/jnigen/logs/. This is useful
for debugging.Breaking Change (#746): Removed support for importMap in favor of the newly added interop mechanism with importing yaml files.
importMap in favor of the newly added interop mechanism
with importing yaml files.java.util.Set, java.util.Map, java.util.List, java.util.Iterator and
the boxed types like java.lang.Integer, java.lang.Double, ... will be
generated as their corresponding classes in package:jni.Breaking Change (#705): Type arguments are now named instead of positional.
long argument truncated it to int in pure dart
bindings.Fix extensions of nested types to use fully qualified generated wrapper names.
suspend fun to Dart async methods. Add
suspend_fun_to_async: true to jnigen.yaml.Bump ffigen and swift2objc versions.
Windows support for running tests and examples on development machines.
Initial version: Basic bindings generation, maven and android utilities
Your coding agent can read these notes before it upgrades. Set up the MCP server →