Attempt to remove non-JNI local reference errors on Android
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 75/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Calme
- Stack technique
- android, swift
- Domaine
- mobile-dev
Piste de recherche
Commencez par JavaObjectHolder.init(object:environment:), où les références jobject entrantes sont promues et où l’avertissement est déclenché. Reproduisez les appels Android JNI sur l’émulateur Android 15 avec l’application FlutterSwift, puis vérifiez que les gestionnaires de messages fréquents du canal de plateforme n’émettent aucune avertissement "Attempt to remove non-JNI local reference".
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Using FlutterSwift with the latest swift-java and Android SDK, I see
2026-04-01 15:37:27.149 7457-7457 ktone.InfernoUI com.lukktone.InfernoUI W Attempt to remove non-JNI local reference
in the Android logs.
Proposed fix is to remove DeleteLocalRef on incoming references in JavaObjectHolder.init to fix Android JNI warnings. (This is by @ampcode-com, I haven't had a chance to review, I hate AI-generated PRs as much as the next person but I haven't had the cycles to look into the root cause myself yet.)
Root Cause
JavaObjectHolder.init(object:environment:) promotes the incoming jobject to a global reference via NewGlobalRef, then checks if the original is a local reference and calls DeleteLocalRef on it. This is problematic because:
-
JNI parameter references are not owned by native code. When Java calls a native method, the
jobjectparameters are local references managed by the JNI frame. The JNI specification states these are automatically cleaned up when the native method returns. Native code should not callDeleteLocalRefon them. -
ART's CheckJNI detects this. Android's runtime (ART) has CheckJNI enabled by default, which distinguishes between locally-created references (via
FindClass,NewObject, etc.) and parameter references. CallingDeleteLocalRefon a parameter reference triggers the warning. -
GetObjectRefTypereturnsJNILocalRefTypefor both cases, so the existing check cannot distinguish parameter references from locally-created references.
Fix
Remove the DeleteLocalRef call entirely. After NewGlobalRef creates a new strong reference to the Java object, the original local reference (whether a parameter or locally-created) will be cleaned up automatically when the JNI frame is popped. This is safe and correct per the JNI specification:
"Local references are valid for the duration of a native method call. They are freed automatically after the native method returns." — JNI Specification
The only scenario where explicit DeleteLocalRef is needed is to avoid local reference table overflow when creating many local references in a loop within a single native method call. JavaObjectHolder.init does not fall into this category.
Testing
Tested on Android 15 (API 36) emulator with a FlutterSwift application that makes frequent JNI calls (platform channel message handlers). Before the fix, every message handler invocation produced 1–3 "Attempt to remove non-JNI local reference" warnings. After the fix, zero warnings are emitted
- Langage dominant
- Swift
- Étoiles
- 1.3k
- Forks
- 127
- Merge moyen
- 1 h 6 min
- PR mergées (30 j)
- 3
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de swiftlang/swift-java
-
Document main actor execution requirements in Java-hosted processesPeut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
swiftlang/swift-java#955 ·
Les mainteneurs répondent en général sous 1 jour
-
wrap-java: Optional convenience methods can fail to compile when a parameter shadows the method nameOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
swiftlang/swift-java#945 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 3/5 1-2 jours Accessibilité débutants 56/100
swiftlang/swift-java#949 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
swiftlang/swift-java#948 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 54/100
swiftlang/swift-java#947 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de swiftlang/swift-java
Issues similaires
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
vorssaint/vorssaint-utils#3917 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
swiftlang/swift-markdown#299 ·
-
send.tracked never delivers to SMS or RCS chats: lowercased GUIDs stay unsent with error 4Peut-être pris @thurstonsand l’a pris aujourd’hui. Ouverteclawsweeper:linked-pr-open clawsweeper:needs-live-repro clawsweeper:no-new-fix-pr impact:message-loss issue-rating: 🐚 platinum hermit P1
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
openclaw/imsg#390 · 1 commentaire · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
area: agents follow-up
Difficulté 2/5 1-3 heures Accessibilité débutants 77/100
manaflow-ai/cmux#37234 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
thunderbird/thunderbird-ios#628 ·
Les mainteneurs répondent en général sous 1 jour