jnigen
A Dart bindings generator for Java and Kotlin that uses JNI under the hood to interop with Java virtual machine.
0.17.0
29K downloads/mo
#1876 most downloaded on pub.dev
dart-lang/native
What this package is like to depend on
Last release 28 days ago
27 Jul 2026
Release timing varies
gaps range from 1 weeks to 6 months
Nearly every release is documented
notes for 27 of 27 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
27 releases · first in 2022
3 releases in the last 12 months
see the full history below
Release timeline
27 releases · Sep 2022 to Jul 2026
2023
2024
2025
2026
Releases
latest 27-
0.17.027 Jul 2026Release notes
Open source →- Update kotlin-metadata-jvm, allowing JNIgen to run on newer packages.
- Fixed incorrect code generation for generic constructors in generic classes.
These are now generated as static
createmethods. - It's no longer necessary to run
flutter build apkbefore running JNIgen in a Flutter project. - JNIgen now uses Flutter's JDK by default. It's no longer necessary to install a separate JDK, if you already have Flutter set up for Android development.
- Fix directory-dependent
dart formatfailures by explicitly searching for the correct Dart executable to run. - Generate minimal Dart stubs for referenced but excluded Java classes, instead
of falling back to
JObject(behind agenerateStubsconfig flag). - Export and document the classes required to write custom visitors. Manual import of j_elements.dart is no longer necessary.
- Breaking Change (technically breaking, but unlikely to affect any users):
elements.dart is no longer exported from the library, as these classes were
always intended to be private.
Config.importedClassesandConfig.importClasses()have also been made private. - Preserve Java
@deprecatedJavadoc messages in generated Dart@Deprecatedannotations. - Support versions 3.x of
package:package_config.
-
0.16.001 Apr 2026Release notes
Open source →- Breaking Change: All Java wrapper classes have been migrated to extension
types. The main effects are:
- No more nullable
JTypeclasses, onlyJTypeclasses, and theJTypeclass is simplified. - It is no longer necessary to pass around the
JTypein many cases where it used to be required.
- No more nullable
- Add docs about debugging.
- Add support for Kotlin interfaces with suspend functions. These can now be
implemented using Dart functions that return a
Future. - Namespace primitive types to avoid collisions with generated API names, eg
bool. - Kotlin suspend functions with no result (a return type of
Unit) now returnFuture<void>in Dart instead ofFuture<JObject>. - Improve error message for unsupported Java class file versions in summary generation.
- Generated extension types now implement their Java interfaces.
- Instance members of generated extension types have been moved to extension methods.
- Breaking Change: Class methods like getFoo, isFoo, and setFoo are now getters and setters in Dart.
- Add compile time version checks to verify consistency of package:jni's versions vs JNIgen's generated code.
- Breaking Change: All Java wrapper classes have been migrated to extension
types. The main effects are:
-
0.15.007 Nov 2025Release notes
Open source →- Changed the names of internal type classes.
- Breaking Change: Removed
excludefrom config. - Updated to the latest lints.
- Sorted imports.
-
0.14.223 May 2025Release notes
Open source →- 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 file that was not generated by JNIgen was found in ...error. - The name
factorycan now also be used in a method name without renaming. - Added the ability to generate classes in Java SDK (
java.core) module without providing the class path. - Added gradle support for new Flutter projects that use
build.gradle.ktsinstead ofbuild.gradle. - Fixed a bug where Kotlin suspend functions that returned nullable values were generated incorrectly.
- Fixed a bug where classes that inherited a generic without specifying all type parameters were not generated.
- Added the ability to generate Kotlin stdlib classes without providing the class path.
- Breaking Change: Throw when output folder contains non JNIgen files.
Users with existing package bindings will need to delete them once to fix the
-
0.14.127 Feb 2025Release notes
Open source →- Added support for generating matching Kotlin operators as Dart operators.
- Include the methods of the superinterfaces of a class or interface in the bindings.
- Fix a bug where Kotlin suspendable functions that returned the result without ever suspending would timeout in Dart.
- Retrieval of dependencies uses Gradle (
GradleTools) in lieu of Maven (MavenTools). - Updated
bin\download_maven_jars.dartto useGradleTools.
-
0.14.031 Jan 2025Release notes
Open source →- Fixed a bug where the source parser would not have all of the type paremeters of the types.
-
0.13.120 Jan 2025Release notes
Open source →- Fixed a bug where Kotlin wildcards would crash the code generation.
- Support nullability annotations that are on Java elements like methods and fields instead of directly on the return type or field type.
- Fixed a bug where enum values were generated as nullable.
- Fixed a bug where type arguments could be nullable when the top type of their paramater was non-nullable.
-
0.13.013 Dec 2024Release notes
Open source →- Breaking Change(#1516):
Inner classes are now generated as
OuterClass$InnerClass. - Breaking Change(#1644): Generate null-safe Dart bindings for Java and Kotlin.
- Fixed a potential name collision when generating in multi-file mode.
- Added the ability to add user-defined visitors to config. Currently only capable of excluding classes, methods, and fields.
- Add dependency override for
package:jniinstead of the path dependency.
- Breaking Change(#1516):
Inner classes are now generated as
-
0.12.215 Nov 2024Release notes
Open source →- Now excludes invalid identifiers by default.
- Fixed a bug where if multiple jars have classes within the same package, only one of them gets generated.
- Fixed a bug where it would be possible for a type class inference to fail.
- Improve the diagnostics when gradle fails when
bin/jnigenis run.
-
0.12.108 Oct 2024 -
0.12.001 Oct 2024Release notes
Open source →- Breaking Change(#1530):
Changed the renaming strategy for method overloadings. Instead of adding a
numeric suffix, we add a dollar sign (
$) 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. - Breaking Change: Each single dollar sign is replaced with two dollar signs in the identifier names.
- Breaking Change: Removed the
Implsuffix from the generated implemenation classes. So the implementation class for an interface namedFoois now simply called$Fooinstead of$FooImpl. - Breaking Change: Renamed and made the typeclasses internal.
- Breaking Change: Relaxed the renaming rules to allow for more identifiers to remain unchanged.
- Added
JImplementerwhich enables building an object that implements multiple Java interfaces. Each interface now has a staticimplementInmethod that takes aJImplementerand the implementation object. - Added the ability to implement void-returning interface methods as listeners.
- Generating identifiers that start with an underscore (
_) and making them public by prepending a dollar sign. - Fixed an issue where inheriting a generic class could generate incorrect code.
- No longer generating constructors for abstract classes.
- No longer generating
protectedelements. - Fixed an issue where synthetic methods caused code generation to fail.
- Breaking Change(#1530):
Changed the renaming strategy for method overloadings. Instead of adding a
numeric suffix, we add a dollar sign (
-
0.11.029 Aug 2024 -
0.10.126 Aug 2024 -
0.10.011 Jul 2024Release notes
Open source →- Added support for Kotlin's top-level functions and fields.
- Used
package:dart_flutter_team_lints.
-
0.9.325 Jun 2024Release notes
Open source →- Fixed a bug where wrong argument types were generated for varargs.
- Fixed the macOS arm64 varargs issue caused by the previous release.
- Support throwing Java exceptions from Dart code. (#1209)
-
0.9.204 Jun 2024Release notes
Open source →- Fixed a bug where wrong argument types were generated for 32-bit architectures. This temporarily breaks generated bindings for macOS arm64, until the fix is cherry-picked on Dart stable.
-
0.9.114 May 2024Release notes
Open source →- 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 some locales.
-
0.9.002 May 2024Release notes
Open source →- Breaking Change (#660): Removed C-based bindings. Now all bindings are Dart-only.
- Expanded constraint on
package:cli_configto allow^0.2.0. - Ignored
use_super_parameterslint in generated files. - Fixed a bug in summarizer and improved the display of errors.
-
0.8.004 Apr 2024Release notes
Open source →- Breaking Change (#981):
fromRefis nowfromReference, and it gets aJReferenceinstead of aPointer<Void>.- Check out the internal changes to
JObjectinpackage:jni's changelog.
- Breaking Change: The generated impl class for interfaces is now an
interface. - Breaking Change (#792]):
static final Stringfields get converted toJStringgetters instead ofstatic const Stringfields in Dart. - Fixed a bug where a package would either be searched from sources or classes but not both.
- Fixed a bug where
<clinit>(class initialization method) which is not necessary to be exposed was generated.
- Breaking Change (#981):
-
0.7.013 Sep 2023Release notes
Open source →- Breaking Change (#563):
Added
JBufferandJByteBufferclasses as default classes forjava.nio.Bufferandjava.nio.ByteBufferrespectively. - Breaking Change: Made the type classes
final. - Added
ignore_for_file: lines_longer_than_80_charsto the generated file preamble. - Added an explicit cast in generated
<Interface>.implementcode to allowdart analyzeto pass whenstrict-castsis set.
- Breaking Change (#563):
Added
-
0.6.001 Sep 2023Release notes
Open source →- Breaking Change (#707):
Renamed
delete*torelease*. - Breaking Change (#585):
Renamed constructors from
ctor1,ctor2, ... tonew1,new2, ... - Breaking Change: Specifying a class always pulls in nested classes by default. If a nested class is specified in config, it will be an error.
- Breaking Change: Removed
suspend_fun_to_asyncflag from the config. It's now happening by default since we read the Kotlin's metadata and reliably identify thesuspend funs. - Fixed a bug where the nested classes would be generated incorrectly depending on the backend used for generation.
- Fixed a bug where ASM backend would produce the incorrect parent for multi-level nested classes.
- Fixed a bug where the backends would produce different descriptors for the same method.
- Added
enable_experimentoption to config. - Created an experiment called
interface_implementationwhich creates a.implementmethod for interfaces, so you can implement them using Dart. - Save all JNIgen logs to a file in
.dart_tool/jnigen/logs/. This is useful for debugging.
- Breaking Change (#707):
Renamed
-
0.5.031 May 2023Release notes
Open source →- Breaking Change (#746):
Removed support for
importMapin favor of the newly added interop mechanism with importing yaml files. - Breaking Change (#746):
java.util.Set,java.util.Map,java.util.List,java.util.Iteratorand the boxed types likejava.lang.Integer,java.lang.Double, ... will be generated as their corresponding classes inpackage:jni. - Strings now use UTF16.
- Breaking Change (#746):
Removed support for
-
0.4.002 May 2023Release notes
Open source →- Breaking Change (#705): Type arguments are now named instead of positional.
- Type parameters can now be inferred when possible.
- Fixed a bug where passing a
longargument truncated it tointin pure dart bindings. - Removed array extensions from the generated code.
- Added the ability to use source dependencies from Gradle.
- Fixed an issue with the field setter.
- Fixed an issue where exceptions were not properly thrown in pure Dart bindings.
-
0.3.016 Feb 2023Release notes
Open source →- Added the option to convert Kotlin
suspend funto Dart async methods. Addsuspend_fun_to_async: truetojnigen.yaml.
- Added the option to convert Kotlin
-
0.2.025 Jan 2023 -
0.1.122 Sep 2022 -
0.1.012 Sep 2022