使用 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 程式碼。 |