[vm/ffi] Initialize `Library::ffi_native_resolver_` on deserializing snapshots

TEST=tests/ffi/native_assets/asset_process_test.dart

Closes: https://github.com/dart-lang/sdk/issues/54607
Change-Id: Id4e787a66f18db98473008b7da690dd2ca79a88e
Cq-Include-Trybots: luci.dart.try:vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-aot-win-debug-x64-try,vm-aot-win-debug-x64c-try,vm-kernel-precomp-linux-release-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/346321
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
diff --git a/runtime/vm/app_snapshot.cc b/runtime/vm/app_snapshot.cc
index 8ec66f2..fe4eedb 100644
--- a/runtime/vm/app_snapshot.cc
+++ b/runtime/vm/app_snapshot.cc
@@ -2447,6 +2447,7 @@
       d.ReadFromTo(lib);
       lib->untag()->native_entry_resolver_ = nullptr;
       lib->untag()->native_entry_symbol_resolver_ = nullptr;
+      lib->untag()->ffi_native_resolver_ = nullptr;
       lib->untag()->index_ = d.Read<int32_t>();
       lib->untag()->num_imports_ = d.Read<uint16_t>();
       lib->untag()->load_state_ = d.Read<int8_t>();
diff --git a/tests/ffi/native_assets/asset_process_test.dart b/tests/ffi/native_assets/asset_process_test.dart
index 4b7ed47..63b0374 100644
--- a/tests/ffi/native_assets/asset_process_test.dart
+++ b/tests/ffi/native_assets/asset_process_test.dart
@@ -57,6 +57,12 @@
   );
   await invokeSelf(
     selfSourceUri: selfSourceUri,
+    runtime: Runtime.appjit,
+    arguments: [runTestsArg],
+    nativeAssetsYaml: nativeAssetsYaml,
+  );
+  await invokeSelf(
+    selfSourceUri: selfSourceUri,
     runtime: Runtime.aot,
     arguments: [runTestsArg],
     nativeAssetsYaml: nativeAssetsYaml,
diff --git a/tests/ffi/native_assets/helpers.dart b/tests/ffi/native_assets/helpers.dart
index e17448b..fe2a11f 100644
--- a/tests/ffi/native_assets/helpers.dart
+++ b/tests/ffi/native_assets/helpers.dart
@@ -116,6 +116,7 @@
 
 enum Runtime {
   aot,
+  appjit,
   jit,
 }
 
@@ -255,13 +256,28 @@
     runtime: runtime,
   );
 
-  if (runtime == Runtime.jit) {
-    await runDart(scriptUri: outDillUri, arguments: runArguments);
-  } else {
-    final snapshotUri = tempUri.resolve('out.snapshot');
-    await runGenSnapshot(dillUri: outDillUri, outputUri: snapshotUri);
-    await runDartAotRuntime(
-        aotSnapshotUri: snapshotUri, arguments: runArguments);
+  switch (runtime) {
+    case Runtime.aot:
+      final snapshotUri = tempUri.resolve('out.snapshot');
+      await runGenSnapshot(dillUri: outDillUri, outputUri: snapshotUri);
+      await runDartAotRuntime(
+          aotSnapshotUri: snapshotUri, arguments: runArguments);
+    case Runtime.appjit:
+      final outJitUri = tempUri.resolve('out.jit');
+      await runDart(
+        toolArgs: [
+          '--snapshot-kind=app-jit',
+          '--snapshot=${outJitUri.toFilePath()}',
+        ],
+        scriptUri: outDillUri,
+        arguments: runArguments,
+      );
+      await runDart(
+        scriptUri: outJitUri,
+        arguments: runArguments,
+      );
+    case Runtime.jit:
+      await runDart(scriptUri: outDillUri, arguments: runArguments);
   }
 }