Skip to content

Commit 9d2b355

Browse files
[jni] Do not require engineId for android app context (#2777)
1 parent 00991b9 commit 9d2b355

File tree

7 files changed

+31
-26
lines changed

7 files changed

+31
-26
lines changed

pkgs/jni/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 0.15.1
2+
3+
- **Breaking Change**: Removed the `engineId` argument from
4+
`Jni.androidApplicationContext` as the application context is not dependant on
5+
the engine ID.
6+
17
## 0.15.0
28

39
- **Breaking Change**: Made `Jni.env` internal.

pkgs/jni/android/src/main/java/com/github/dart_lang/jni/JniPlugin.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package com.github.dart_lang.jni;
66

7+
import android.annotation.SuppressLint;
78
import android.app.Activity;
89
import android.content.Context;
910
import androidx.annotation.NonNull;
@@ -18,11 +19,14 @@ public class JniPlugin implements FlutterPlugin, ActivityAware {
1819
private static final ConcurrentHashMap<Long, JniPlugin> pluginMap = new ConcurrentHashMap<>();
1920

2021
private long engineId;
21-
private volatile Context context;
22+
23+
@SuppressLint("StaticFieldLeak")
24+
private static Context context;
25+
2226
private volatile Activity activity;
2327

24-
public static @NonNull Context getApplicationContext(long engineId) {
25-
return Objects.requireNonNull(pluginMap.get(engineId)).context;
28+
public static @NonNull Context getApplicationContext() {
29+
return context;
2630
}
2731

2832
public static @Nullable Activity getActivity(long engineId) {
@@ -40,7 +44,6 @@ public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
4044

4145
@Override
4246
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
43-
context = null;
4447
activity = null;
4548
pluginMap.remove(engineId);
4649
}

pkgs/jni/example/lib/main.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,7 @@ void showToast(String text) {
4949
'(Landroid/app/Activity;Landroid/content/Context;'
5050
'Ljava/lang/CharSequence;I)'
5151
'Lcom/github/dart_lang/jni_example/Toaster;');
52-
final applicationContext =
53-
Jni.androidApplicationContext(PlatformDispatcher.instance.engineId!);
52+
final applicationContext = Jni.androidApplicationContext;
5453
final toaster = makeText(toasterClass, JObject.type, [
5554
activity,
5655
applicationContext,

pkgs/jni/lib/src/jni.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,10 @@ abstract final class Jni {
216216
/// Retrieves the global Android `ApplicationContext` associated with a
217217
/// Flutter engine.
218218
///
219-
/// Pass `PlatformDispatcher.instance.engineId` to the [engineId] field.
220-
///
221219
/// The `ApplicationContext` is a long-lived singleton tied to the
222-
/// application's lifecycle. It is safe to store and use from any thread
223-
/// for non-UI tasks.
224-
static JObject androidApplicationContext(int engineId) {
225-
return JniPlugin.getApplicationContext(engineId);
220+
/// application's lifecycle. It is safe to store and use from any thread.
221+
static JObject get androidApplicationContext {
222+
return JniPlugin.getApplicationContext();
226223
}
227224

228225
/// Retrieves the current Android `Activity` associated with a Flutter engine.

pkgs/jni/lib/src/plugin/generated_plugin.dart

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,26 @@ class JniPlugin extends jni$_.JObject {
8888

8989
static final _id_getApplicationContext = _class.staticMethodId(
9090
r'getApplicationContext',
91-
r'(J)Landroid/content/Context;',
91+
r'()Landroid/content/Context;',
9292
);
9393

9494
static final _getApplicationContext = jni$_.ProtectedJniExtensions.lookup<
95-
jni$_.NativeFunction<
96-
jni$_.JniResult Function(jni$_.Pointer<jni$_.Void>,
97-
jni$_.JMethodIDPtr, jni$_.VarArgs<(jni$_.Int64,)>)>>(
98-
'globalEnv_CallStaticObjectMethod')
95+
jni$_.NativeFunction<
96+
jni$_.JniResult Function(
97+
jni$_.Pointer<jni$_.Void>,
98+
jni$_.JMethodIDPtr,
99+
)>>('globalEnv_CallStaticObjectMethod')
99100
.asFunction<
100101
jni$_.JniResult Function(
101-
jni$_.Pointer<jni$_.Void>, jni$_.JMethodIDPtr, int)>();
102+
jni$_.Pointer<jni$_.Void>,
103+
jni$_.JMethodIDPtr,
104+
)>();
102105

103-
/// from: `static public android.content.Context getApplicationContext(long j)`
106+
/// from: `static public android.content.Context getApplicationContext()`
104107
/// The returned object must be released after use, by calling the [release] method.
105-
static jni$_.JObject getApplicationContext(
106-
int j,
107-
) {
108+
static jni$_.JObject getApplicationContext() {
108109
return _getApplicationContext(_class.reference.pointer,
109-
_id_getApplicationContext as jni$_.JMethodIDPtr, j)
110+
_id_getApplicationContext as jni$_.JMethodIDPtr)
110111
.object<jni$_.JObject>(const jni$_.$JObject$Type$());
111112
}
112113

pkgs/jni/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
name: jni
66
description: A library to access JNI from Dart and Flutter that acts as a support library for package:jnigen.
7-
version: 0.15.0
7+
version: 0.15.1
88
repository: https://github.com/dart-lang/native/tree/main/pkgs/jni
99
issue_tracker: https://github.com/dart-lang/native/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Ajni
1010

pkgs/jnigen/example/in_app_java/lib/main.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import 'package:jni/jni.dart';
1010
// structure.
1111
import 'android_utils.g.dart';
1212

13-
JObject context =
14-
Jni.androidApplicationContext(PlatformDispatcher.instance.engineId!);
13+
JObject context = Jni.androidApplicationContext;
1514

1615
final hashmap = HashMap(K: JString.type, V: JString.type);
1716

0 commit comments

Comments
 (0)