Skip to content

JNI violates strict mode policy on Android #2508

@qk7b

Description

@qk7b

Summary

Adding JNI to a Flutter project makes the app slow at startup and might cause ANR

Steps to reproduce

  1. Create a flutter app.
  2. Add JNI package
  3. Add Strict Mode to Android to see what is going on.

pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  jni: ^0.14.2

Result

This logs shows up

StrictMode policy violation; ~duration=485 ms: android.os.strictmode.DiskReadViolation               	
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1596)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:249)
at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:7929)
at libcore.io.IoUtils.canOpenReadOnly(IoUtils.java:275)
at dalvik.system.DexPathList$NativeLibraryElement.findNativeLibrary(DexPathList.java:884)
at dalvik.system.DexPathList.findLibrary(DexPathList.java:595)
at dalvik.system.BaseDexClassLoader.findLibrary(BaseDexClassLoader.java:281)
at java.lang.Runtime.loadLibrary0(Runtime.java:1061)
at java.lang.Runtime.loadLibrary0(Runtime.java:1008)
at java.lang.System.loadLibrary(System.java:1664)
at com.github.dart_lang.jni.JniPlugin.<clinit>(JniPlugin.java:52)
at io.flutter.plugins.GeneratedPluginRegistrant.registerWith(GeneratedPluginRegistrant.java:19)
at java.lang.reflect.Method.invoke(Native Method)
at io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister.registerGeneratedPlugins(GeneratedPluginRegister.java:80)
at io.flutter.embedding.android.FlutterActivity.configureFlutterEngine(FlutterActivity.java:1343)
at io.flutter.embedding.android.FlutterActivityAndFragmentDelegate.onAttach(FlutterActivityAndFragmentDelegate.java:220)
at io.flutter.embedding.android.FlutterActivity.onCreate(FlutterActivity.java:645)
at android.app.Activity.performCreate(Activity.java:8006)
at android.app.Activity.performCreate(Activity.java:7990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3589)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3780)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2251)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:233)
at android.app.ActivityThread.main(ActivityThread.java:8068)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)

Because of

static {
    System.loadLibrary("dartjni");
}

In

static {
System.loadLibrary("dartjni");
}

This might cause ANR errors in Android apps.

Possible solutions

Maybe do this in an other thread ? An Executor or something ?
To prevent blocking the main thread

Metadata

Metadata

Type

No type

Projects

Status

No status

Relationships

None yet

Development

No branches or pull requests

Issue actions