blob: 5bb51c65ea43467310da45c19c3fa843f2dd4ecf [file] [edit]
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// Package jni provides dart bindings for the Java Native Interface (JNI) on
/// Android and desktop platforms.
///
/// It's intended as a supplement to the JNIgen tool, a Java wrapper generator
/// using JNI. The goal of this package is to provide sufficiently complete
/// and ergonomic access to underlying JNI APIs.
///
/// Therefore, some understanding of JNI is required to use this module.
///
/// ## Java VM
/// On Android, the existing JVM is used, a new JVM needs to be spawned on
/// flutter desktop & standalone targets.
///
/// ```dart
/// if (!Platform.isAndroid) {
/// // Spin up a JVM instance with custom classpath etc..
/// Jni.spawn(/* options */);
/// }
/// ```
///
/// ## Dart standalone support
/// On dart standalone target, we unfortunately have no mechanism to bundle
/// the wrapper libraries with the executable. Thus it needs to be explicitly
/// placed in a accessible directory and provided as an argument to Jni.spawn.
///
/// This module depends on a shared library written in C. Therefore on dart
/// standalone:
///
/// * Run `dart run jni:setup` to build the shared library. This command builds
/// all dependency libraries with native code (package:jni and JNIgen-generated
/// libraries if any).
///
/// The default output directory is build/jni_libs, which can be changed
/// using `-B` switch.
///
/// * Provide the location of library to `Jni.spawn` call.
///
/// ## JNIEnv
/// `GlobalJniEnv` type provides a thin wrapper over `JNIEnv*` which can be used
/// from across threads, and always returns JNI global references. This is
/// needed because Dart doesn't make guarantees about even the straight-line
/// code being scheduled on the same thread.
///
/// ## Debugging
/// Debugging JNI errors hard in general.
///
/// * On desktop platforms you can use JniEnv.ExceptionDescribe to print any
/// pending exception to stdout.
/// * On Android, things are slightly easier since CheckJNI is usually enabled
/// in debug builds. If you are not getting clear stack traces on JNI errors,
/// check the Android NDK page on how to enable CheckJNI using ADB.
/// * As a rule of thumb, when there's a NoClassDefFound / NoMethodFound error,
/// first check your class and method signatures for typos. Another common
/// reason for NoClassDefFound error is missing classes in classpath.
/// This library provides classes and functions for JNI interop from Dart.
library;
export 'package:ffi/ffi.dart' show Arena, using;
export 'src/core_bindings.dart'
show
$JCollection,
$JIterator,
$JList,
$JMap,
$JMap$JEntry,
$JSet,
JArrayList,
JArrayList$$Methods,
JBoolean,
JBoolean$$Methods,
JByte,
JByte$$Methods,
JCharacter,
JCharacter$$Methods,
JCollection,
JCollection$$Methods,
JDouble,
JDouble$$Methods,
JFloat,
JFloat$$Methods,
JHashMap,
JHashMap$$Methods,
JHashSet,
JHashSet$$Methods,
JInteger,
JInteger$$Methods,
JIterator,
JIterator$$Methods,
JList,
JList$$Methods,
JLong,
JLong$$Methods,
JMap,
JMap$$Methods,
JNumber,
JNumber$$Methods,
JSet,
JSet$$Methods,
JShort,
JShort$$Methods,
JString,
JString$$Methods;
export 'src/errors.dart';
export 'src/jarray.dart';
export 'src/jimplementer.dart';
export 'src/jni.dart'
hide InternalJniExtension, ProtectedJniExtensions, StringMethodsForJni;
export 'src/jobject.dart' hide $JObject$Type$;
export 'src/jreference.dart' hide ProtectedJReference;
export 'src/jvalues.dart';
export 'src/lang/lang.dart';
export 'src/nio/nio.dart';
export 'src/types.dart' hide JTypeBase;
export 'src/util/util.dart' hide JIteratorAdapter;