blob: 97d3581b5c911dc4536f58225476a5d82cde19b1 [file] [log] [blame] [view] [edit]
## jnigen examples
This directory contains examples on how to use jnigen.
| Directory | Description |
| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| [in_app_java](https://github.com/dart-lang/native/tree/main/pkgs/jnigen/example/in_app_java/) | Demonstrates how to include custom Java code in Flutter application and call that using jnigen |
| [pdfbox_plugin](https://github.com/dart-lang/native/tree/main/pkgs/jnigen/example/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](https://github.com/dart-lang/native/tree/main/pkgs/jnigen/example/notification_plugin/) | Example of a reusable Flutter plugin with custom Java code which uses Android libraries. |
| [kotlin_plugin](https://github.com/dart-lang/native/tree/main/pkgs/jnigen/example/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](https://github.com/dart-lang/native/tree/main/pkgs/jnigen/example/pdfbox_plugin/jnigen.yaml).
- 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](https://github.com/dart-lang/native/tree/main/pkgs/jnigen/example/pdfbox_plugin/dart_example/bin/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](https://github.com/dart-lang/native/tree/main/pkgs/jnigen/example/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.