內容

使用套件:jnigen 的 Java 互操作

在 Android、Windows、macOS 和 Linux 上的 Dart 原生平台 上執行的 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:
  c:
    library_name: example
    path: src/example/
  dart:
    path: lib/example.dart
    structure: single_file

source_path:
  - 'java/'
classes:
  - 'dev.dart.Example'

path 指定產生的 cdart 繫結的路徑。

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(和 C)繫結,請執行 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 和產生的 C 檔案建置動態函式庫。Java 來源也必須編譯。為此,請執行

$ dart run jni:setup -p jni -s src/example
$ javac java/dev/dart/Example.java

現在您可以執行範例

$ dart run jnigen_example:sum 17 25

輸出 42

更多範例

#

以下是使用 package:jnigen 的一些更全面的範例

範例說明
in_app_java展示如何在 Flutter 應用程式中包含自訂 Java 程式碼,並使用 jnigen 呼叫它。
pdfbox_pluginFlutter 外掛程式範例,提供與 Apache PDFBox 函式庫的繫結。
notification_plugin可重複使用的 Flutter 外掛程式範例,具備使用 Android 函式庫的自訂 Java 程式碼。