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.
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 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.
flutter build apk
. After a release build is done, jnigen can use a gradle stub to collect compile classpaths.android/src/main/java
hierarchy of the plugin.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.