From 64599ea9ebccbf7397071ab64dc4a3d85647b613 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:00:17 -0800 Subject: [PATCH 1/8] Draft of some possible native interop updates --- .../android/jni-call-lifecycle-dark.svg | 4 + .../android/jni-call-lifecycle-light.png | Bin 0 -> 128564 bytes .../android/jni-call-lifecycle-light.svg | 4 + ...ll-jetpack-apis.md => call-native-apis.md} | 4 +- .../android/compose-activity.md | 373 +++++++++++++++++- .../platform-integration/android/jnigen.md | 243 ++++++++++++ .../android/request-permission.md | 195 +++++++++ .../native-code-options.md | 56 +++ .../platform-integration/platform-channels.md | 6 +- src/data/sidenav/default.yml | 18 +- 10 files changed, 890 insertions(+), 13 deletions(-) create mode 100644 site/web/assets/images/android/jni-call-lifecycle-dark.svg create mode 100644 site/web/assets/images/android/jni-call-lifecycle-light.png create mode 100644 site/web/assets/images/android/jni-call-lifecycle-light.svg rename src/content/platform-integration/android/{call-jetpack-apis.md => call-native-apis.md} (97%) create mode 100644 src/content/platform-integration/android/jnigen.md create mode 100644 src/content/platform-integration/android/request-permission.md create mode 100644 src/content/platform-integration/native-code-options.md diff --git a/site/web/assets/images/android/jni-call-lifecycle-dark.svg b/site/web/assets/images/android/jni-call-lifecycle-dark.svg new file mode 100644 index 00000000000..f21306c8840 --- /dev/null +++ b/site/web/assets/images/android/jni-call-lifecycle-dark.svg @@ -0,0 +1,4 @@ + + +Android APIsFlutter AppBindingsC/C++NDK - Native Development KitJava Native InterfaceLifecycle of a Java Native Interface(JNI) Call \ No newline at end of file diff --git a/site/web/assets/images/android/jni-call-lifecycle-light.png b/site/web/assets/images/android/jni-call-lifecycle-light.png new file mode 100644 index 0000000000000000000000000000000000000000..38cbb9992b2e8f52d7a325c2502fb1d0a50e2166 GIT binary patch literal 128564 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 SVpkRB=G0XlDwile4*frOt;_QO literal 0 HcmV?d00001 diff --git a/site/web/assets/images/android/jni-call-lifecycle-light.svg b/site/web/assets/images/android/jni-call-lifecycle-light.svg new file mode 100644 index 00000000000..b10c537f6ec --- /dev/null +++ b/site/web/assets/images/android/jni-call-lifecycle-light.svg @@ -0,0 +1,4 @@ + + +Android APIsFlutter AppBindingsC/C++NDK - Native Development KitJava Native InterfaceLifecycle of a Java Native Interface(JNI) Call \ No newline at end of file diff --git a/src/content/platform-integration/android/call-jetpack-apis.md b/src/content/platform-integration/android/call-native-apis.md similarity index 97% rename from src/content/platform-integration/android/call-jetpack-apis.md rename to src/content/platform-integration/android/call-native-apis.md index d2476b9145d..d29f800ed37 100644 --- a/src/content/platform-integration/android/call-jetpack-apis.md +++ b/src/content/platform-integration/android/call-native-apis.md @@ -1,6 +1,6 @@ --- -title: "Calling JetPack APIs" -description: "Use the latest Android APIs from your Dart code" +title: "Calling Native APIs" +description: "Use an Android API directly from Flutter code" --- diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md index 30e84b6674f..5d23ffd1f4c 100644 --- a/src/content/platform-integration/android/compose-activity.md +++ b/src/content/platform-integration/android/compose-activity.md @@ -15,8 +15,24 @@ you will have access to the full breadth of native Android functionality. Adding this functionality requires making several changes to your Flutter app and its internal, generated Android app. + +There are two ways to do it: Either using `jnigen` or Method Channels. + +## Overview of launching Activities using `jnigen` + +On the Flutter side, you will need to create Dart bindings for various Android APIs +and call them using Dart code. This will involve setting up `jni`, `jnigen`, +and a configuration file describing the generated output. + +On the Android side, you will need to make some modifications to some Android build +files to account for Compose views and a new `Activity`. + + +## Overview of launching Activities using Method Channels + On the Flutter side, you will need to create a new platform method channel and call its `invokeMethod` method. + On the Android side, you will need to register a matching native `MethodChannel` to receive the signal from Dart and then launch a new activity. Recall that all Flutter apps (when running on Android) exist within @@ -36,7 +52,360 @@ check out [Hosting native Android views][]. Not all Android activities use Jetpack Compose, but this tutorial assumes you want to use Compose. -## On the Dart side +## Launch Activity Using Native Interop (`jnigen`) + +### On the command line + +On the commandline, add `jnigen` as a development dependency +and `jni` as a runtime dependency. `jnigen` will be used to +generate Dart bindings and then when the app is run, `jni` +will execute them. +```sh +flutter pub add jnigen --dev +flutter pub add jni +``` + +### On the Dart side + +In your dart code, create jnigen.dart file specifying the +bindings you will be generating. + +First, run the following command to build the app and make +available the files needed to execute code generation. + +```sh +flutter build apk +``` + + +In a new file `tool\jnigen.dart`, add the following code. + +```dart +import 'dart:io'; + +import 'package:jnigen/jnigen.dart'; + +void main(List args) { + final packageRoot = Platform.script.resolve('../'); + generateJniBindings( + Config( + outputConfig: OutputConfig( + dartConfig: DartCodeOutputConfig( + path: packageRoot.resolve('lib/gen/android.g.dart'), + structure: OutputStructure.singleFile, + ), + ), + androidSdkConfig: AndroidSdkConfig(addGradleDeps: true), + classes: [ + // provided by Android OS + 'android.os.Bundle', + 'android.content.Intent', + 'android.content.Context' + ], + ), + ); +} +``` + +Execute `dart run tool/jnigen.dart` to generate the Dart bindings. + +With the bindings generated, we can directly + +```dart +import 'package:flutter/material.dart'; +// uses added namespace because some bindings conflict with Dart classes (Intent) +import 'package:android_launch_activity/gen/android.g.dart' as native; +import 'package:jni/jni.dart'; + +// Context.fromReference ensures we get Android Context object +// rather than the default `JObject` +var context = native.Context.fromReference(Jni.androidApplicationContext.reference); + +void main() { + runApp(const MainApp()); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + // SECTION 2: START COPYING HERE + void _launchAndroidActivity() { + + var intent = native.Intent.new$1(context, native.SecondActivity.type.jClass); + intent.addFlags(native.Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra$18('message'.toJString(), 'Hello from Flutter'.toJString()); + context.startActivity(intent); + + intent.release(); + +} + // SECTION 2: END COPYING HERE + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: const Center(child: Text('Hello World!')), + floatingActionButton: FloatingActionButton( + // SECTION 3: Call `_launchAndroidActivity` somewhere. + onPressed: _launchAndroidActivity, + + // SECTION 3: End + tooltip: 'Launch Android activity', + child: const Icon(Icons.launch), + ), + ), + ); + } +} + +``` + + +### On the Android Side + +You must make changes to 4 files in the generated Android app to +ready it for launching fresh Compose activities. + +The first file requiring modifications is `android/app/build.gradle`. + + 1. Add the following to the existing `android` block: + + + + + ```kotlin title="android/app/build.gradle.kts" + android { + // Begin adding here + buildFeatures { + compose = true + } + composeOptions { + // https://developer.android.com/jetpack/androidx/releases/compose-kotlin + kotlinCompilerExtensionVersion = "1.4.8" + } + // End adding here + } + ``` + + + + + ```groovy title="android/app/build.gradle" + android { + // Begin adding here + buildFeatures { + compose true + } + composeOptions { + // https://developer.android.com/jetpack/androidx/releases/compose-kotlin + kotlinCompilerExtensionVersion = "1.4.8" + } + // End adding here + } + ``` + + + + + Visit the [developer.android.com][] link in the code snippet and + adjust `kotlinCompilerExtensionVersion`, as necessary. + You should only need to do this if you + receive errors during `flutter run` and those errors tell you + which versions are installed on your machine. + + [developer.android.com]: {{site.android-dev}}/jetpack/androidx/releases/compose-kotlin + + 2. Next, add the following block at the bottom of the file, at the root level: + + + + + ```kotlin title="android/app/build.gradle.kts" + dependencies { + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.activity:activity-compose") + implementation(platform("androidx.compose:compose-bom:2024.06.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material:material") + implementation("androidx.compose.material3:material3") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2024.06.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + } + ``` + + + + + ```groovy title="android/app/build.gradle" + dependencies { + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.activity:activity-compose") + implementation(platform("androidx.compose:compose-bom:2024.06.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material:material") + implementation("androidx.compose.material3:material3") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") +implementation "androidx.core:core-ktx:1.10.1" +implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" +implementation "androidx.activity:activity-compose" +implementation platform("androidx.compose:compose-bom:2024.06.00") +implementation "androidx.compose.ui:ui" +implementation "androidx.compose.ui:ui-graphics" +implementation "androidx.compose.ui:ui-tooling-preview" +implementation "androidx.compose.material:material" +implementation "androidx.compose.material3:material3" +testImplementation "junit:junit:4.13.2" +androidTestImplementation "androidx.test.ext:junit:1.1.5" +androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" +androidTestImplementation platform("androidx.compose:compose-bom:2023.08.00") +androidTestImplementation "androidx.compose.ui:ui-test-junit4" +debugImplementation "androidx.compose.ui:ui-tooling" +debugImplementation "androidx.compose.ui:ui-test-manifest" + } + ``` + + + + + The second file requiring modifications is `android/build.gradle`. + + 1. Add the following buildscript block at the top of the file: + + + + + ```kotlin title="android/build.gradle.kts" + buildscript { + dependencies { + // Replace with the latest version. + classpath("com.android.tools.build:gradle:8.1.1") + } + repositories { + google() + mavenCentral() + } + } + ``` + + + + + ```groovy title="android/build.gradle" + buildscript { + dependencies { + // Replace with the latest version. + classpath 'com.android.tools.build:gradle:8.1.1' + } + repositories { + google() + mavenCentral() + } + } + ``` + + + + + The third file requiring modifications is + `android/app/src/main/AndroidManifest.xml`. + + 1. In the root application block, add the following `` declaration: + + ```xml title="android/app/src/main/AndroidManifest.xml" + + + + // START COPYING HERE + + // END COPYING HERE + + + … + + ``` + + The fourth and final code requiring modifications is + `android/app/src/main/kotlin/com/example/flutter_android_activity/MainActivity.kt`. + Here you'll write Kotlin code for your desired Android functionality. + + 1. Add the necessary imports at the top of the file + :::note + Your imports might vary if library versions have changed or + if you introduce different Compose classes when + you write your own Kotlin code. + Follow your IDE's hints for the correct imports you require. + ::: + + ```dart + package com.example.android_launch_activity + +import android.content.Intent +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.ui.Modifier +import androidx.core.app.ActivityCompat +import io.flutter.embedding.android.FlutterActivity + ``` + + + 1. Add a second `Activity` to the bottom of the file, which you + referenced in the previous changes to `AndroidManifest.xml`: + + ```kotlin title="MainActivity.kt" +class SecondActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + MaterialTheme { + Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { + Column { + Text(text = "Second Activity") + // Note: This must match the shape of the data passed from your Dart code. + Text("" + getIntent()?.getExtras()?.getString("message")) + Button(onClick = { finish() }) { + Text("Exit") + } + } + } + } + } + } +} + ``` + + +## Launch Activity using `MethodChannels` + +### On the Dart side On the Dart side, create a method channel and invoke it from a specific user interaction, like tapping a button. @@ -105,7 +474,7 @@ There are 3 important values that must match across your Dart and Kotlin code: In this case, the data is a map with a single `"message"` key. -## On the Android side +### On the Android side You must make changes to 4 files in the generated Android app to ready it for launching fresh Compose activities. diff --git a/src/content/platform-integration/android/jnigen.md b/src/content/platform-integration/android/jnigen.md new file mode 100644 index 00000000000..c39834535b5 --- /dev/null +++ b/src/content/platform-integration/android/jnigen.md @@ -0,0 +1,243 @@ +--- +title: "Calling Native APIs with jnigen" +description: "Use an Android API directly from Flutter code" +--- + +## Overview + +`jnigen` stands for Java Native Interface GENeration. It is a means for +calling native Java and Kotlin (JVM) code from Dart. It builds upon the FFI (Foreign Function Interface) package that C-based languages use. + +## How It Works + +Before we can use a native interop call in an application, we need to do a little setup. + +The APISummarizer is a tool that reads source and bytecode to determine which classes and functions are present. The abstract syntax tree defining the desired classes is read to create Dart versions with modifications to account for the differences between the Java platform and Dart. + +Diagram should go here + + +Node tree + + + +:::warning +There is an alternate method of specifying generation output using a `jnigen.yaml` file. +That method is considered deprecated. +::: + + +### Step 1: Create a new app project + +### Step 2: Add `jni` and `jnigen` as dependencies + +```sh +dart pub add jni +dart pub add jnigen --dev +``` + +To make sure that Android OS APIs and whatever dependencies are available to `jnigen`, run the following to build +an Android apk of the application. + +```sh +flutter build apk +``` + +### Step 3: Set configuration of Dart bindings +There is a Dart API in `jnigen` to specify the properties your generated should have. You will create +a Dart file. `tool\jnigen.dart` is the convention but you can create it anywhere. The file needs at +minimum a single function call to `generateJniBindings` that accepts a `Config` object as a parameter. + +Here is a minimal configuration file. + +```dart +import 'dart:io'; + +import 'package:jnigen/jnigen.dart'; + +void main(List args) { + final packageRoot = Platform.script.resolve('../'); + generateJniBindings( + Config( + outputConfig: OutputConfig( + dartConfig: DartCodeOutputConfig( + path: packageRoot.resolve('lib/gen/'), + structure: OutputStructure.packageStructure, + ), + ), + classes: [ + // Core Java classes are generally available + // like java.util.ArrayList, etc + + // Android OS classes are also available + // provided `flutter build apk` is run + // before this function + + // 'java.util.ArrayList', + // 'android.widget.Toast', + ], + ), + ); + + +``` + + +The `Config` object is a Dart API for specifying: + +* the location of developer-created source code, +* the final location of the generated Dart code, +* dependencies to download from online repositories, and, +* specifics of the Android version to build against. + +```dart +Config({ + required OutputConfig outputConfig, + required List classes, + Set? experiments, + List? sourcePath, + List? classPath, + String? preamble, + Map? customClassBody, + AndroidSdkConfig? androidSdkConfig, + MavenDownloads? mavenDownloads, + SummarizerOptions? summarizerOptions, + List? nonNullAnnotations, + List? nullableAnnotations, + Level logLevel = Level.INFO, + String? dumpJsonTo, + List? imports, + List? visitors +}) +``` + +Here is the final configuration file to generate Dart bindings to show an Android `Toast` message. + +```dart +import 'dart:io'; + +import 'package:jnigen/jnigen.dart'; + +void main(List args) { + final packageRoot = Platform.script.resolve('../'); + generateJniBindings( + Config( + outputConfig: OutputConfig( + dartConfig: DartCodeOutputConfig( + path: packageRoot.resolve('lib/gen/android.g.dart'), + structure: OutputStructure.singleFile, + ), + ), + androidSdkConfig: AndroidSdkConfig(addGradleDeps: true), + classes: [ + 'android.widget.Toast', // provided by Android OS + ], + ), + ); +} + +``` + +Finally, run + +```sh +dart tool/jnigen.dart +``` + + +### Step 4: Call Dart bindings + +```dart +// Retrieves an Android context to pass with native calls +JObject context = Jni.androidApplicationContext; + +/// Display DateTime retrieved from Dart +void showToast() { + final message = 'The time is now ${DateTime.now()}'; + +// Corresponds to this second signature +// public static Toast makeText (Context context, +// CharSequence text, +// int duration) +// First one uses R namespace resources + Toast.makeText$1(context, message.toJString(), Toast.LENGTH_LONG)!.show(); +} +``` + +Here is the full `main.dart` file. + +:::note +Java/Kotlin and Dart differ on support of overloaded functions, that's to say functions that use the same +name but differ on return type, parameter type, or number of parameters. + +To compensate for this, when Dart bindings are built, overloaded functions take the form of +`functionName$`. At present, they are parsed in the order that they appear in the files +so there might not be a correlation between number and type of parameters and the eventual Dart identifier. +::: + +```dart + +import 'package:android_toast_demo/gen/android/os/_package.dart'; +import 'package:android_toast_demo/gen/android/widget/_package.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:jni/jni.dart'; + + +JObject context = Jni.androidApplicationContext; + + +/// Display DateTime retrieved from Dart +void showToast() { + final message = 'The time is now ${DateTime.now()}'; + +// Corresponds to this second signature +// public static Toast makeText (Context context, +// CharSequence text, +// int duration) +// First one uses R namespace resources + Toast.makeText$1(context, message.toJString(), Toast.LENGTH_LONG)!.show(); +} + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData(primarySwatch: Colors.teal), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatelessWidget { + const MyHomePage({super.key, required this.title}); + + final String title; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text(title)), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + child: const Text('Show Time'), + onPressed: () => showToast(), + ), + ], + ), + ), + ); + } +} + +``` diff --git a/src/content/platform-integration/android/request-permission.md b/src/content/platform-integration/android/request-permission.md new file mode 100644 index 00000000000..02c36f574fe --- /dev/null +++ b/src/content/platform-integration/android/request-permission.md @@ -0,0 +1,195 @@ +--- +title: "Request Android permissions" +description: "Request and manage Android permissions from jni code using a plugin" +--- + +## Overview + +This page details a means to use `jnigen` to wrap native Android code and package that functionality +as a plugin. It demonstrates requesting and querying Android permissions natively from Flutter. + +With this flow, one only has to edit a single file on the Android side. + +The code for [this plugin][] can be found here. + +## How It Works + +### `jnigen` Setup + +```dart + +import 'package:jnigen/jnigen.dart'; + +void main(List args) { + final packageRoot = Platform.script.resolve('../'); + generateJniBindings( + Config( + outputConfig: OutputConfig( + dartConfig: DartCodeOutputConfig( + path: packageRoot.resolve('lib/gen/android.g.dart'), + structure: OutputStructure.singleFile, + ), + ), + androidSdkConfig: AndroidSdkConfig(addGradleDeps: true, androidExample: 'example/'), + classes: [ + // provided by Android OS + 'android.app.Application', + 'androidx.activity.ComponentActivity', + 'androidx.fragment.app.FragmentActivity', + 'androidx.activity.result.ActivityResult', + 'androidx.core.app.ActivityCompat', + 'androidx.activity.result.ActivityResultCallback', + 'androidx.activity.result.ActivityResultLauncher', + 'androidx.activity.result.contract.ActivityResultContract', + 'android.content.Intent', + //'android.content.Context', + 'androidx.core.content.ContextCompat', + 'android.Manifest', + 'android.content.pm.PackageManager' + ], + ), + ); +} + +``` + +### Plugin implementation + +```dart +import 'package:flutter/foundation.dart'; + +import 'permissions_plugin_platform_interface.dart'; +import 'gen/android.g.dart'; +import 'package:jni/jni.dart'; + +class PermissionsPlugin { + Future getPlatformVersion() { + return PermissionsPluginPlatform.instance.getPlatformVersion(); + } + + // + bool checkPermission(JObject context, String permission) { + // Returns a simple true or false if the permission has been granted + var result = ContextCompat.checkSelfPermission( + context, + permission.toJString(), + ); + return result == PackageManager.PERMISSION_GRANTED ? true : false; + } + + int checkAndRequestPermission( + JObject context, + String permission, + Function callback, + ) { + // Do I have permission? + if (ContextCompat.checkSelfPermission(context, permission.toJString()) == + PackageManager.PERMISSION_GRANTED) { + callback(); + } else if (ActivityCompat.shouldShowRequestPermissionRationale( + Jni.androidActivity(PlatformDispatcher.instance.engineId!), + permission.toJString(), + ) == + true) { + // Has the user denied the permission before? + // Give a reason why I need the permission + // and allow a re-request + print("I should ask for permission"); + // TODO Flow to show UI to reshow perms dialog + return -2; + } else { + // Ask for permission + ActivityCompat.requestPermissions( + Jni.androidActivity(PlatformDispatcher.instance.engineId!), + JArray.of(JString.type, [permission.toJString()]), + 0, + ); + } + return 0; + } +} + +``` + +### Using the plugin in an app + +Using this implementation of permissions means you only need to edit one bit of Android code to +add the possible permissions into the app's `AndroidManifest.xml` file. If the permission +does not exist in that file, `checkAndRequestPermission` will fail silently. + +```xml + + + + + + + +``` + +#### Initialize the plugin + +```dart +class _MyAppState extends State { + String _platformVersion = 'Unknown'; + final _permissionsPlugin = PermissionsPlugin(); + + @override + void initState() { + super.initState(); + initPlatformState(); + } + // ... +} +``` + +Here is how the two implemented functions look on the Dart side. + +```dart +// Returns true or false if the permission has been granted +_permissionsPlugin.checkPermission( + Jni.androidApplicationContext, + "android.permission.CAMERA" +); + + +// Check for the permission and run execute a callback if allowed +_permissionsPlugin.checkAndRequestPermission( + Jni.androidApplicationContext, + "android.permission.CAMERA", + () { /* Code to run if the permission was granted */}, + ); + +``` + + + +```dart +@override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar(title: const Text('Plugin example app')), + body: Center( + child: Column( + children: [ + Text('Running on: $_platformVersion\n'), + FilledButton( + child: Text("Request Camera Permissions"), + onPressed: () { +_permissionsPlugin.checkAndRequestPermission( + Jni.androidApplicationContext, + "android.permission.CAMERA", + () {}, + ); + }, + ), + ], + ), + ), + ), + ); + +``` + +[this plugin]: https://github.com/flutter/demos/tree/main/native_interop_demos/permissions_plugin diff --git a/src/content/platform-integration/native-code-options.md b/src/content/platform-integration/native-code-options.md new file mode 100644 index 00000000000..b0b6f4ffcfd --- /dev/null +++ b/src/content/platform-integration/native-code-options.md @@ -0,0 +1,56 @@ +--- +title: Writing custom platform-specific code +shortTitle: Platform-specific code +description: Learn how about the options to call platform specific code in your app. +--- + +## Overview + +You have a number of options to use platform-specific code +in your Dart and Flutter apps from low level options that +require a deep knowledge of Dart and the host language to +high level options that allow you to use a high level API +to abstract some of the native bits away. They are: + +* Direct native interop using FFI or JNI + +This method involves an addtional step to generate code +bindings from the host platform language into Dart. + +* Self-managed platform channels + +This method involves using a plugin that hosts native code +which is executed asynchronously through message passing +from Dart to iOS/Android and back. + +* Type-safe plaform channels via Pigeon + +With regular method channels, one must manage type safety +and object serialization on their own. With Pigeon, the +message contents are managed as well as giving the developer +a level of control over the generated Dart API. It is best +seen as a superset of regular platform channels. + +* Or some combination of the above. + + +## Which should I use? + +There are a lot of considerations that may determine which to +use including familiarity with the language the native OS is +written in, comfort with low-level considerations like memory +management, and the breadth of the underlying API surface you +would like to implement. + +*I need to access a few native-code functions.* + +Use `ffi/jnigen`. Making a discrete plugin for a single function +on a single class would be overkill. + +*I need to implement the same interface on iOS and Android.* + +Use `pigeon`. + +*I need to re-implement a full native API in Dart.* + +Consider `pigeon` augmented by `ffi/jnigen`. diff --git a/src/content/platform-integration/platform-channels.md b/src/content/platform-integration/platform-channels.md index 67e27eac9c7..5c0ee38089c 100644 --- a/src/content/platform-integration/platform-channels.md +++ b/src/content/platform-integration/platform-channels.md @@ -1,7 +1,7 @@ --- -title: Writing custom platform-specific code -shortTitle: Platform-specific code -description: Learn how to write custom platform-specific code in your app. +title: Using message passing to execute platform-specific code +shortTitle: Platform-channel code +description: Learn how to use platform channels in your app. --- diff --git a/src/data/sidenav/default.yml b/src/data/sidenav/default.yml index 9dfc17b4c68..89795661f15 100644 --- a/src/data/sidenav/default.yml +++ b/src/data/sidenav/default.yml @@ -365,9 +365,11 @@ permalink: /reference/supported-platforms - title: Build desktop apps with Flutter permalink: /platform-integration/desktop - - title: Write platform-specific code + - title: Write platform-specific code (new) + permalink: /platform-integration/native-code-options + - title: Communicate with the host OS (old pigeon/platform channels topic) permalink: /platform-integration/platform-channels - - title: Bind to native code + - title: Bind to native code using ffi (title change) permalink: /platform-integration/bind-native-code - title: Android permalink: /platform-integration/android @@ -380,10 +382,14 @@ permalink: /platform-integration/android/predictive-back - title: Host a native Android view permalink: /platform-integration/android/platform-views - - title: Calling JetPack APIs - permalink: /platform-integration/android/call-jetpack-apis - - title: Launch a Jetpack Compose activity + - title: Call native APIs (delete) + permalink: /platform-integration/android/call-native-apis + - title: Use jnigen to call Android code (new) + permalink: /platform-integration/android/jnigen + - title: Launch a Jetpack Compose activity (updated) permalink: /platform-integration/android/compose-activity + - title: Request Android permissions from Flutter (new) + permalink: /platform-integration/android/request-permission - title: Restore state on Android permalink: /platform-integration/android/restore-state-android - title: Target ChromeOS with Android @@ -910,4 +916,4 @@ - title: flutter CLI permalink: /reference/flutter-cli - title: API docs - permalink: https://api.flutter.dev \ No newline at end of file + permalink: https://api.flutter.dev From 5b2dd833669e23b4045cb2a8343ee7a763fe7b6a Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:02:39 -0800 Subject: [PATCH 2/8] Update compose-activity.md --- src/content/platform-integration/android/compose-activity.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md index 5d23ffd1f4c..041821986b3 100644 --- a/src/content/platform-integration/android/compose-activity.md +++ b/src/content/platform-integration/android/compose-activity.md @@ -27,6 +27,9 @@ and a configuration file describing the generated output. On the Android side, you will need to make some modifications to some Android build files to account for Compose views and a new `Activity`. +The [code][] for this version is available on Github. + +[code]:https://github.com/flutter/demos/tree/main/native_interop_demos/android_launch_activity ## Overview of launching Activities using Method Channels From 158cd1ab6405ddf36dc47c7d56163e272e6a6d6e Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:12:42 -0800 Subject: [PATCH 3/8] Update src/content/platform-integration/android/compose-activity.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/android/compose-activity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md index 041821986b3..a4617b4d9cb 100644 --- a/src/content/platform-integration/android/compose-activity.md +++ b/src/content/platform-integration/android/compose-activity.md @@ -81,7 +81,7 @@ flutter build apk ``` -In a new file `tool\jnigen.dart`, add the following code. +In a new file `tool/jnigen.dart`, add the following code. ```dart import 'dart:io'; From e97fcb8d7d51da201e03e4b600ce6a808eb97f19 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:13:41 -0800 Subject: [PATCH 4/8] Update src/content/platform-integration/android/compose-activity.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/android/compose-activity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md index a4617b4d9cb..891fdc7006a 100644 --- a/src/content/platform-integration/android/compose-activity.md +++ b/src/content/platform-integration/android/compose-activity.md @@ -360,7 +360,7 @@ debugImplementation "androidx.compose.ui:ui-test-manifest" Follow your IDE's hints for the correct imports you require. ::: - ```dart +```kotlin package com.example.android_launch_activity import android.content.Intent From 43a288fd8d7b64f406c035c146e08e8a38584e7c Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:14:50 -0800 Subject: [PATCH 5/8] Clean up jnigen.md by removing unused content Removed placeholder for diagram and extra line breaks. --- src/content/platform-integration/android/jnigen.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/content/platform-integration/android/jnigen.md b/src/content/platform-integration/android/jnigen.md index c39834535b5..8d097000769 100644 --- a/src/content/platform-integration/android/jnigen.md +++ b/src/content/platform-integration/android/jnigen.md @@ -14,8 +14,6 @@ Before we can use a native interop call in an application, we need to do a littl The APISummarizer is a tool that reads source and bytecode to determine which classes and functions are present. The abstract syntax tree defining the desired classes is read to create Dart versions with modifications to account for the differences between the Java platform and Dart. -Diagram should go here - Node tree @@ -82,7 +80,6 @@ void main(List args) { ``` - The `Config` object is a Dart API for specifying: * the location of developer-created source code, From bc7d973e5a6907da40c6db0b7d1ee8f629a890d0 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:15:43 -0800 Subject: [PATCH 6/8] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/android/jnigen.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/android/jnigen.md b/src/content/platform-integration/android/jnigen.md index 8d097000769..1e08e4addce 100644 --- a/src/content/platform-integration/android/jnigen.md +++ b/src/content/platform-integration/android/jnigen.md @@ -43,7 +43,7 @@ flutter build apk ### Step 3: Set configuration of Dart bindings There is a Dart API in `jnigen` to specify the properties your generated should have. You will create -a Dart file. `tool\jnigen.dart` is the convention but you can create it anywhere. The file needs at +a Dart file. `tool/jnigen.dart` is the convention but you can create it anywhere. The file needs at minimum a single function call to `generateJniBindings` that accepts a `Config` object as a parameter. Here is a minimal configuration file. From d219e5017d415499f71a369dc362523ece3551b8 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:16:18 -0800 Subject: [PATCH 7/8] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/native-code-options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/native-code-options.md b/src/content/platform-integration/native-code-options.md index b0b6f4ffcfd..64782c99457 100644 --- a/src/content/platform-integration/native-code-options.md +++ b/src/content/platform-integration/native-code-options.md @@ -14,7 +14,7 @@ to abstract some of the native bits away. They are: * Direct native interop using FFI or JNI -This method involves an addtional step to generate code +This method involves an additional step to generate code bindings from the host platform language into Dart. * Self-managed platform channels From 61c5f44ae031fab3853062de1994afe9682528b6 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:17:00 -0800 Subject: [PATCH 8/8] Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/native-code-options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/native-code-options.md b/src/content/platform-integration/native-code-options.md index 64782c99457..78a1dff4850 100644 --- a/src/content/platform-integration/native-code-options.md +++ b/src/content/platform-integration/native-code-options.md @@ -23,7 +23,7 @@ This method involves using a plugin that hosts native code which is executed asynchronously through message passing from Dart to iOS/Android and back. -* Type-safe plaform channels via Pigeon +* Type-safe platform channels via Pigeon With regular method channels, one must manage type safety and object serialization on their own. With Pigeon, the