package:jnigen을 사용한 Java 상호 운용

package:jnigen을 사용한 Java 상호 운용

Dart 프로그램에서 Java를 사용하려면 package:jnigen을 사용해요.

출처: Java interop using package:jnigen

본문

Dart Native 플랫폼(Android, Windows, macOS, Linux)에서 실행되는 Dart 모바일 앱, 커맨드라인 앱, 서버 앱은 package:jnipackage:jnigen을 사용해서 Java와 Kotlin API를 호출할 수 있어요.

package:jni는 Dart 코드가 JNI를 통해 Java와 상호 작용할 수 있게 해 줘요. 다만 그렇게 하려면 보일러플레이트(boilerplate) 코드가 많이 필요해서, 주어진 Java API에 대한 Dart 바인딩을 자동으로 생성해 주는 package:jnigen을 사용할 수 있어요.

Kotlin은 Java 바이트코드로 컴파일할 수 있으므로, package:jnigen이 Kotlin용 바인딩도 생성할 수 있어요.

간단한 Java 예제

이 가이드는 package:jnigen을 사용해서 간단한 클래스에 대한 바인딩을 생성하는 예제를 단계별로 안내해요.

사전 요구사항

  • JDK

jnigen 설정하기

먼저 package:jni를 의존성으로 추가하고, package:jnigen을 dev 의존성으로 추가해요.

$ 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이라는 public static 메서드를 가진 아주 간단한 클래스가 있어요:

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

이 예제에서는 jnigen.yaml에서 지정한 대로 lib/example.dart가 생성돼요.

이 파일에는 Java 파일과 마찬가지로 sum이라는 static 메서드를 가진 Example 클래스가 들어 있어요.

바인딩 사용하기

이제 생성된 라이브러리를 로드하고 상호 작용할 준비가 됐어요. 예제 앱 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: Apache PDFBox 라이브러리에 대한 바인딩을 제공하는 Flutter 플러그인 예제예요.
  • notification_plugin: Android 라이브러리를 사용하는 사용자 정의 Java 코드가 있는 재사용 가능한 Flutter 플러그인 예제예요.

더 알아보기