Skip to content

[jni] Fix possible receiver NPEs - #3784

Merged
liamappelbe merged 10 commits into
mainfrom
jni_npe
Nov 8, 2026
Merged

liamappelbe merged 10 commits into
mainfrom
jni_npe

Conversation

@liamappelbe

@liamappelbe liamappelbe commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

There are cases where some Java runtimes (notably ART) doesn't safely handle null pointers, crashing instead of throwing a NPE. The main case we're trying to fix is receiver objects.

  • Add a new .nonNullPointer getter to JReference, which checks that the pointer is not null.
  • Use .nonNullPointer instead of .pointer whenever we're getting a pointer to be used as the receiver object. Do this throughout JNI and in JNIgen's dart_generator.dart
    • Don't use it for args (even those annotated with @NonNull), because that's redundant with checks done inside Java, which throw a NPE instead of crashing.

Gemini also found and fixed some other possible NPEs, but these are unlikely to be related to the reported bug:

  • DefineClass, FindClass, GetSuperclass
  • Jni.throwException
  • JGlobalReference's constructor
  • GetExceptionDetails in dartjni.c
  • to_global_ref in dartjni.h

Fixes b/578950407

@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

PR Health

Breaking changes ✔️
Package Change Current Version New Version Needed Version Looking good?
jni Non-Breaking 1.1.2 1.2.0-wip 1.2.0-wip ✔️
jni_flutter Non-Breaking 1.0.4+1 1.0.5-wip 1.0.5-wip ✔️

This check can be disabled by tagging the PR with skip-breaking-check.

API leaks ✔️

The following packages contain symbols visible in the public API, but not exported by the library. Export these symbols or remove them from your publicly visible API.

Package Leaked API symbol Leaking sources

This check can be disabled by tagging the PR with skip-leaking-check.

Changelog Entry ✔️
Package Changed Files

Changes to files need to be accounted for in their respective changelogs.

This check can be disabled by tagging the PR with skip-changelog-check (for example, for non-user-visible changes when the package version is already at -wip).

@codecov

codecov Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 54.83871% with 14 lines in your changes missing coverage. Please review.
✅ Project coverage is 85.87%. Comparing base (baad15a) to head (10704d1).

Files with missing lines Patch % Lines
pkgs/jni/lib/src/types.dart 20.00% 8 Missing ⚠️
pkgs/jni/lib/src/jclass.dart 28.57% 5 Missing ⚠️
pkgs/jni/lib/src/jreference.dart 83.33% 1 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #3784      +/-   ##
==========================================
- Coverage   85.88%   85.87%   -0.01%     
==========================================
  Files         322      322              
  Lines       20855    20853       -2     
==========================================
- Hits        17911    17908       -3     
- Misses       2944     2945       +1     
Flag Coverage Δ
jni 66.58% <53.33%> (+0.10%) ⬆️
jnigen 82.85% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
code_assets 95.31% <ø> (ø)
data_assets 91.56% <ø> (ø)
ffi 100.00% <ø> (ø)
ffigen 91.45% <ø> (ø)
hooks 86.40% <ø> (ø)
hooks_runner 90.79% <ø> (-0.06%) ⬇️
jni 66.58% <53.33%> (+0.10%) ⬆️
jni_flutter ∅ <ø> (∅)
jni_util 25.00% <ø> (ø)
jnigen 82.85% <100.00%> (ø)
json_syntax_generator 42.01% <ø> (ø)
native_test_helpers 85.71% <ø> (ø)
native_toolchain_c 96.22% <ø> (-0.02%) ⬇️
objective_c 79.72% <ø> (+0.17%) ⬆️
pub_formats ∅ <ø> (∅)
record_use 81.48% <ø> (ø)
snippet_tool 66.23% <ø> (ø)
swift2objc 92.95% <ø> (ø)
swiftgen 80.41% <ø> (ø)
test_case_selector 97.28% <ø> (ø)
Files with missing lines Coverage Δ
pkgs/jni/lib/src/jni.dart 68.53% <100.00%> (+1.15%) ⬆️
pkgs/jni/lib/src/version_check.dart 100.00% <ø> (ø)
pkgs/jnigen/lib/src/bindings/dart_generator.dart 90.02% <100.00%> (ø)
pkgs/jni/lib/src/jreference.dart 92.10% <83.33%> (-0.76%) ⬇️
pkgs/jni/lib/src/jclass.dart 67.28% <28.57%> (ø)
pkgs/jni/lib/src/types.dart 34.21% <20.00%> (-1.91%) ⬇️

... and 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@liamappelbe liamappelbe changed the title WIP [jni] NPE [jni] Fix possible receiver NPEs Nov 6, 2026
@liamappelbe
liamappelbe marked this pull request as ready for review November 6, 2026 06:12
@liamappelbe
liamappelbe merged commit f7edbde into main Nov 8, 2026
65 of 66 checks passed
@liamappelbe
liamappelbe deleted the jni_npe branch November 8, 2026 02:18
copybara-service Bot pushed a commit to dart-lang/sdk that referenced this pull request Nov 12, 2026
Revisions updated by `dart tools/rev_sdk_deps.dart`.

core (https://github.com/dart-lang/core/compare/36f57a9..fa0c6b7):
  fa0c6b77  Fri Nov 6 12:56:58 2026 +0100  Michael Thomsen  Release os_detect 2.0.4 (dart-lang/core#1038)

dartdoc (https://github.com/dart-lang/dartdoc/compare/03ec6df..7e2508c):
  7e2508c6  Wed Nov 11 14:52:22 2026 +0200  Sergey G. Grekhov  Add constructor doc comment tests for enums and extension types (dart-lang/dartdoc#4316)
  03dfb467  Mon Nov 9 11:00:32 2026 +0200  Sergey G. Grekhov  `#3330`. Split test for parameters to separate tests (dart-lang/dartdoc#4314)
  23302d53  Mon Nov 9 10:56:34 2026 +0200  Sergey G. Grekhov  Add tests for primary constructors (dart-lang/dartdoc#4313)

ecosystem (https://github.com/dart-lang/ecosystem/compare/54e1673..1d2b5ff):
  1d2b5ff  Tue Nov 10 09:04:24 2026 -0800  Kevin Moore  feat(repo_manage): add --replace-pattern to report changelog (dart-lang/ecosystem#482)

http (https://github.com/dart-lang/http/compare/4646fe6..2bac218):
  2bac218  Fri Nov 6 17:49:23 2026 -0800  dart-ecosystem-bot[bot]  Tidy: package:cronet_http
  cdf967c  Fri Nov 6 15:40:49 2026 -0800  Brian Quinlan  chore(groundkeeper): use stable for flutter (dart-lang/http#2066)
  6582177  Thu Nov 5 13:04:35 2026 -0800  Brian Quinlan  doc: use timeout as an abort example (dart-lang/http#2062)

native (https://github.com/dart-lang/native/compare/6287745..b21ef2d):
  b21ef2da3  Wed Nov 11 16:07:34 2026 +0530  dhairya05  [json_syntax_generator] Pass the parameter name to ArgumentError.value (dart-lang/native#3787)
  20a607e48  Wed Nov 11 07:28:03 2026 -0300  Daco Harkes  [code_assets] [hooks] [hooks_runner] Adopt `.g.dart` for generated files (dart-lang/native#3790)
  cc974ddec  Wed Nov 11 19:59:39 2026 +1100  Liam Appelbe  [objective_c] Fix `isValidObject` bug on iOS simulator (dart-lang/native#3788)
  f7edbdee3  Sun Nov 8 13:18:25 2026 +1100  Liam Appelbe  [jni] Fix possible receiver NPEs (dart-lang/native#3784)
  0ca7d6745  Fri Nov 6 10:20:21 2026 -0300  Daco Harkes  [code_assets] [hooks_runner] [native_toolchain_c] Prepare for release (dart-lang/native#3781)
  baad15ab4  Fri Nov 6 02:56:52 2026 +0100  Kravchenko Igor  [objective_c] Link Foundation in the native support library (dart-lang/native#3782)

shelf (https://github.com/dart-lang/shelf/compare/9946de5..b175e9f):
  b175e9f  Tue Nov 10 09:14:31 2026 +0530  Muhammad Uvesh  shelf_static: ignore invalid If-Modified-Since headers (dart-lang/shelf#557)
  02b5f94  Sat Nov 7 23:09:28 2026 +0530  dhairya05  Fix typo in shelf_router docs (dart-lang/shelf#556)

test (https://github.com/dart-lang/test/compare/2a9e017..3533ae1):
  3533ae1e  Tue Nov 10 15:06:08 2026 -0800  Nate Bosch  Never retry tearDownAll (dart-lang/test#2815)
  5680b0b1  Fri Nov 6 12:52:11 2026 +0100  Sigurd Meldgaard  Add globalSetup and addGlobalTearDown APIs for cross-suite setup and teardown (dart-lang/test#2714)
  b8dc888a  Thu Nov 5 18:11:37 2026 -0800  Nate Bosch  [checks_codegen] Skip private fields and fields referencing private types (dart-lang/test#2782)
  66e062c4  Thu Nov 5 16:05:36 2026 -0800  Nate Bosch  [checks_codegen] Generate full field types with imports (dart-lang/test#2781)

tools (https://github.com/dart-lang/tools/compare/727fd9c..589d844):
  589d844c4  Wed Nov 11 20:27:32 2026 +0300  Hasan Armoush  fix(markdown): combine adjacent Text nodes when the element is last in its list (dart-lang/tools#2598)

Change-Id: I13acaa7378c86f2c33d88f3c4b163acf2b48ff08
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/576820
Commit-Queue: Nate Bosch <[email protected]>
Reviewed-by: Nicholas Shahan <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants