From c4970be93a14501dea5bf1ba2b2a78c79e9e9673 Mon Sep 17 00:00:00 2001 From: Eduardo Speroni Date: Wed, 11 Feb 2026 17:13:52 -0300 Subject: [PATCH 1/2] feat: add `@CriticalNative` and `@FastNative` to safe methods --- test-app/runtime/src/main/cpp/com_tns_Runtime.cpp | 13 +++++++++---- test-app/runtime/src/main/java/com/tns/Runtime.java | 7 +++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/test-app/runtime/src/main/cpp/com_tns_Runtime.cpp b/test-app/runtime/src/main/cpp/com_tns_Runtime.cpp index 01777f9ab..5395536be 100644 --- a/test-app/runtime/src/main/cpp/com_tns_Runtime.cpp +++ b/test-app/runtime/src/main/cpp/com_tns_Runtime.cpp @@ -25,6 +25,7 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { return JNI_VERSION_1_6; } +// @FastNative signature - optimized JNI, keeps JNIEnv* for jstring handling extern "C" JNIEXPORT void Java_com_tns_Runtime_SetManualInstrumentationMode(JNIEnv* _env, jobject obj, jstring mode) { try { Runtime::SetManualInstrumentationMode(mode); @@ -214,13 +215,14 @@ extern "C" JNIEXPORT void Java_com_tns_Runtime_createJSInstanceNative(JNIEnv* _e } } -extern "C" JNIEXPORT jint Java_com_tns_Runtime_generateNewObjectId(JNIEnv* env, jobject obj, jint runtimeId) { +// @CriticalNative signature - no JNIEnv* or jobject parameters +extern "C" JNIEXPORT jint Java_com_tns_Runtime_generateNewObjectId(jint runtimeId) { try { auto runtime = TryGetRuntime(runtimeId); if (runtime == nullptr) { return 0; } - return runtime->GenerateNewObjectId(env, obj); + return runtime->GenerateNewObjectId(nullptr, nullptr); } catch (NativeScriptException& e) { e.ReThrowToJava(); } catch (std::exception e) { @@ -236,6 +238,7 @@ extern "C" JNIEXPORT jint Java_com_tns_Runtime_generateNewObjectId(JNIEnv* env, return 0; } +// @FastNative signature - optimized JNI, keeps JNIEnv* for NotifyGC extern "C" JNIEXPORT jboolean Java_com_tns_Runtime_notifyGc(JNIEnv* env, jobject obj, jint runtimeId) { auto runtime = TryGetRuntime(runtimeId); if (runtime == nullptr) { @@ -288,11 +291,13 @@ extern "C" JNIEXPORT void Java_com_tns_Runtime_passExceptionToJsNative(JNIEnv* e } } -extern "C" JNIEXPORT jint Java_com_tns_Runtime_getPointerSize(JNIEnv* env, jobject obj) { +// @CriticalNative signature - no JNIEnv* or jobject parameters +extern "C" JNIEXPORT jint Java_com_tns_Runtime_getPointerSize() { return sizeof(void*); } -extern "C" JNIEXPORT jint Java_com_tns_Runtime_getCurrentRuntimeId(JNIEnv* _env, jobject obj) { +// @CriticalNative signature - no JNIEnv* or jobject parameters +extern "C" JNIEXPORT jint Java_com_tns_Runtime_getCurrentRuntimeId() { Isolate* isolate = Isolate::TryGetCurrent(); if (isolate == nullptr) { return -1; diff --git a/test-app/runtime/src/main/java/com/tns/Runtime.java b/test-app/runtime/src/main/java/com/tns/Runtime.java index 14c2aa438..d59e5308c 100644 --- a/test-app/runtime/src/main/java/com/tns/Runtime.java +++ b/test-app/runtime/src/main/java/com/tns/Runtime.java @@ -35,6 +35,8 @@ import java.util.concurrent.FutureTask; import java.util.concurrent.RunnableFuture; import java.util.concurrent.atomic.AtomicInteger; +import dalvik.annotation.optimization.CriticalNative; +import dalvik.annotation.optimization.FastNative; public class Runtime { private native void initNativeScript(int runtimeId, String filesPath, String nativeLibDir, boolean verboseLoggingEnabled, boolean isDebuggable, String packageName, @@ -50,8 +52,10 @@ private native void initNativeScript(int runtimeId, String filesPath, String nat private native void createJSInstanceNative(int runtimeId, Object javaObject, int javaObjectID, String canonicalName); + @CriticalNative private native int generateNewObjectId(int runtimeId); + @FastNative private native boolean notifyGc(int runtimeId); private native void lock(int runtimeId); @@ -60,10 +64,13 @@ private native void initNativeScript(int runtimeId, String filesPath, String nat private native void passExceptionToJsNative(int runtimeId, Throwable ex, String message, String fullStackTrace, String jsStackTrace, boolean isDiscarded); + @CriticalNative private static native int getCurrentRuntimeId(); + @CriticalNative public static native int getPointerSize(); + @FastNative public static native void SetManualInstrumentationMode(String mode); private static native void WorkerGlobalOnMessageCallback(int runtimeId, String message); From 4ecd7f07f2309d59a65c954a499ea82c5f0de20d Mon Sep 17 00:00:00 2001 From: Eduardo Speroni Date: Wed, 11 Feb 2026 18:13:44 -0300 Subject: [PATCH 2/2] fix: change generateNewObjectId to static native method --- test-app/runtime/src/main/java/com/tns/Runtime.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-app/runtime/src/main/java/com/tns/Runtime.java b/test-app/runtime/src/main/java/com/tns/Runtime.java index d59e5308c..3455d5084 100644 --- a/test-app/runtime/src/main/java/com/tns/Runtime.java +++ b/test-app/runtime/src/main/java/com/tns/Runtime.java @@ -53,7 +53,7 @@ private native void initNativeScript(int runtimeId, String filesPath, String nat private native void createJSInstanceNative(int runtimeId, Object javaObject, int javaObjectID, String canonicalName); @CriticalNative - private native int generateNewObjectId(int runtimeId); + private static native int generateNewObjectId(int runtimeId); @FastNative private native boolean notifyGc(int runtimeId);