jnigen 0.8.0 copy "jnigen: ^0.8.0" to clipboard
jnigen: ^0.8.0 copied to clipboard

A Dart bindings generator for Java and Kotlin that uses JNI under the hood to interop with Java virtual machine.


jnigen examples #

This directory contains examples on how to use jnigen.

Directory Description
in_app_java Demonstrates how to include custom Java code in Flutter application and call that using jnigen
pdfbox_plugin Example of a flutter plugin which provides bindings to Apache PDFBox library. Currently works on Flutter desktop and Dart standalone on linux.
notification_plugin Example of a reusable Flutter plugin with custom Java code which uses Android libraries.
kotlin_plugin Example of using jnigen to generate bindings for Kotlin.

We intend to cover few more use cases in future.

Creating a jnigen-based plugin from scratch #

Dart package (Standalone only) #

  • Create dart package, add jni as dependency and jnigen as dev dependency.

  • Write the jnigen config similar to the one in pdfbox_plugin.

  • Generate JNI bindings by running dart run jnigen --config jnigen.yaml.

  • In the CLI project which uses this package, add this package, and jni as a dependency.

  • Run dart run jni:setup to build native libraries for JNI base library and jnigen generated package.

  • Import the package. See pdf_info.dart for an example of using JNI from dart standalone.

Flutter FFI plugin #

Flutter FFI plugin has the advantage of bundling the required native libraries along with Android / Linux Desktop app.

To create an FFI plugin with JNI bindings:

  • Create a plugin using plugin_ffi template.

  • Remove ffigen-specific files and stubs.

  • Follow the above steps to generate JNI bindings. The plugin can be used from a flutter project.

  • It may be desirable to generate the bindings into a private directory (Eg: lib/src/third_party) and re-export the classes from the top level dart file.

  • To use the plugin from Dart projects as well, comment-out or remove flutter SDK requirements from the pubspec. This is however problematic if you want to publish the package.

Android plugin with custom Java code #

  • Create an FFI plugin with Android as the only platform.
  • Build the example/ Android project using command flutter build apk. After a release build is done, jnigen can use a gradle stub to collect compile classpaths.
  • Write your custom Java code in android/src/main/java hierarchy of the plugin.
  • Generate JNI bindings as described above. See notification_plugin/jnigen.yaml for example configuration.

Pure dart bindings #

With Pure dart bindings PoC, most of the FFI setup steps are not required. For example, a simple flutter package can be created instead of an FFI plugin, since there are no native artifacts to bundle.

The generated bindings still depend on package:jni, therefore running dart run jni:setup is still a requirement on standalone target.

pub points


verified publisherlabs.dart.dev

A Dart bindings generator for Java and Kotlin that uses JNI under the hood to interop with Java virtual machine.

Repository (GitHub)
View/report issues


#interop #ffi #codegen #java #jni


API reference


BSD-3-Clause (LICENSE)


args, cli_config, json_annotation, logging, meta, package_config, path, pub_semver, yaml


Packages that depend on jnigen