目錄

使用 package:jnigen 的 Java 互操作

在 Android、Windows、macOS 和 Linux 上,於 Dart Native 平台執行的 Dart 行動裝置、命令列和伺服器應用程式可以使用 package:jnipackage:jnigen 來呼叫 Java 和 Kotlin API。

package:jni 允許 Dart 程式碼透過 JNI 與 Java 互動。但是,這樣做會涉及許多重複的程式碼,因此您可以使用 package:jnigen 自動為指定的 Java API 產生 Dart 繫結。

您可以將 Kotlin 編譯為 Java 位元組碼,允許 package:jnigen 也為 Kotlin 產生繫結。

簡單的 Java 範例

#

本指南將逐步引導您完成一個範例,該範例使用 package:jnigen 為簡單的類別產生繫結。

先決條件

#

設定 jnigen

#

首先,將 package:jni 新增為相依性,並將 package:jnigen 新增為開發相依性

$ dart pub add jni dev:jnigen

接下來,建立一個名為 jnigen.yaml 的頂層檔案。此檔案包含產生繫結的設定。

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 的公開靜態方法

java
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 相同。

dart
// 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提供 Apache PDFBox 函式庫繫結的 Flutter 外掛程式範例。
notification_plugin具有自訂 Java 程式碼且使用 Android 函式庫的可重複使用 Flutter 外掛程式範例。