使用 package:jnigen 进行 Java 互操作
在 Android、Windows、macOS 和 Linux 上运行于 Dart Native 平台的 Dart 移动、命令行和服务器应用可以使用 package:jni
和 package:jnigen
调用 Java 和 Kotlin API。
package:jni
允许 Dart 代码通过 JNI 与 Java 交互。但是,这样做会涉及大量样板代码,因此您可以使用 package:jnigen
自动为给定的 Java API 生成 Dart 绑定。
您可以将 Kotlin 编译为 Java 字节码,从而使 package:jnigen
也能为 Kotlin 生成绑定。
简单 Java 示例
#本指南将引导您了解一个示例,该示例使用 package:jnigen
为一个简单类生成绑定。
先决条件
#- JDK
- Maven
配置 jnigen
#首先,将 package:jni
添加为依赖项,将 package:jnigen
添加为开发依赖项。
dart pub add jni dev:jnigen
接下来,创建一个名为 jnigen.yaml
的顶层文件。此文件包含用于生成绑定的配置。
output:
dart:
path: lib/example.dart
structure: single_file
source_path:
- 'java/'
classes:
- 'dev.dart.Example'
path
指定生成的 dart
绑定的路径。
source_path
指定要为其生成绑定的 Java 源文件的路径,classes
指定 Java 类。
java/dev/dart/Example.java
包含一个非常简单的类,它有一个名为 sum
的公共静态方法
package dev.dart;
public class Example {
public static int sum(int a, int b) {
return a + b;
}
}
生成 Dart 绑定
#要生成 Dart 绑定,请运行 jnigen
并使用 --config
选项指定配置文件
dart run jnigen --config jnigen.yaml
在此示例中,这将生成 lib/example.dart,与您在 jnigen.yaml
中指定的完全一致。
此文件包含一个名为 Example
的类,它有一个名为 sum
的静态方法,就像 Java 文件一样。
使用绑定
#现在您可以加载并与生成的库进行交互了。示例应用 bin/sum.dart 获取两个数字作为参数并打印它们的和。使用 Example.sum
方法与 Java 完全相同。
// a and b are integer arguments
print(Example.sum(a, b));
运行示例
#在运行示例之前,您必须为 jni
构建动态库。Java 源代码也必须编译。为此,请运行
dart run jni:setup
javac java/dev/dart/Example.java
现在您可以运行示例了
dart run jnigen_example:sum 17 25
输出 42
!
更多示例
#以下是使用 package:jnigen
的更全面的示例:
示例 | 描述 |
---|---|
in_app_java | 演示如何在 Flutter 应用程序中包含自定义 Java 代码并使用 jnigen 调用它。 |
pdfbox_plugin | 一个 Flutter 插件示例,它提供了与 Apache PDFBox 库的绑定。 |
notification_plugin | 一个可重用的 Flutter 插件示例,它包含使用 Android 库的自定义 Java 代码。 |