@@ -37,11 +37,18 @@ static NAPIValue invoke(NAPIEnv globalEnv, NAPICallbackInfo info) {
3737 return JSUtils::JavaObjectToJsValue (globalEnv, ret);
3838}
3939
40+ // 单线程共用
41+ thread_local NAPIRuntime runtime;
42+ thread_local int ctxCount = 0 ;
43+
4044extern " C"
4145JNIEXPORT jlong JNICALL
4246Java_com_didi_hummer_core_engine_napi_jni_JSEngine_createJSContext (JNIEnv *env, jclass clazz) {
47+ if (ctxCount == 0 ) {
48+ NAPICreateRuntime (&runtime);
49+ }
4350 NAPIEnv globalEnv;
44- NAPICreateEnv (&globalEnv);
51+ NAPICreateEnv (&globalEnv, runtime );
4552
4653 NAPIHandleScope handleScope;
4754 napi_open_handle_scope (globalEnv, &handleScope);
@@ -50,6 +57,8 @@ Java_com_didi_hummer_core_engine_napi_jni_JSEngine_createJSContext(JNIEnv *env,
5057
5158 int64_t ctxPtr = JSUtils::toJsContextPtr (globalEnv);
5259 JSUtils::addHandleScope (ctxPtr, handleScope);
60+
61+ ctxCount++;
5362 return ctxPtr;
5463}
5564
@@ -66,6 +75,13 @@ Java_com_didi_hummer_core_engine_napi_jni_JSEngine_destroyJSContext(JNIEnv *env,
6675 }
6776
6877 NAPIFreeEnv (globalEnv);
78+
79+ if (ctxCount > 0 ) {
80+ ctxCount--;
81+ if (ctxCount == 0 ) {
82+ NAPIFreeRuntime (runtime);
83+ }
84+ }
6985}
7086
7187extern " C"
@@ -93,6 +109,61 @@ Java_com_didi_hummer_core_engine_napi_jni_JSEngine_evaluateJavaScript(JNIEnv *en
93109 return JSUtils::JsValueToJavaObject (globalEnv, result);
94110}
95111
112+ extern " C"
113+ JNIEXPORT jbyteArray JNICALL
114+ Java_com_didi_hummer_core_engine_napi_jni_JSEngine_compileJavaScript (JNIEnv *env, jclass clazz, jlong js_context, jstring script, jstring scriptId) {
115+ auto globalEnv = JSUtils::toJsContext (js_context);
116+ const char *charScript = env->GetStringUTFChars (script, nullptr );
117+ const char *charScriptId = env->GetStringUTFChars (scriptId, nullptr );
118+
119+ const uint8_t *byteBuffer;
120+ size_t bufferSize;
121+ auto status = NAPICompileToByteBuffer (globalEnv, charScript, charScriptId, &byteBuffer, &bufferSize);
122+ LOGD (" compile bytecode status: %d" , status);
123+
124+ env->ReleaseStringUTFChars (script, charScript);
125+ env->ReleaseStringUTFChars (script, charScriptId);
126+
127+ if (status == NAPIExceptionPendingException) {
128+ reportExceptionIfNeed (globalEnv);
129+ return nullptr ;
130+ }
131+
132+ jbyteArray ret = env->NewByteArray ((jsize) bufferSize);
133+ env->SetByteArrayRegion (ret, 0 , (jsize) bufferSize, reinterpret_cast <const jbyte*>(byteBuffer));
134+ NAPIFreeByteBuffer (globalEnv, byteBuffer);
135+
136+ return ret;
137+ }
138+
139+ extern " C"
140+ JNIEXPORT jobject JNICALL
141+ Java_com_didi_hummer_core_engine_napi_jni_JSEngine_evaluateBytecode (JNIEnv *env, jclass clazz, jlong js_context, jbyteArray bytecode) {
142+ auto globalEnv = JSUtils::toJsContext (js_context);
143+
144+ jsize bufferSize = env->GetArrayLength (bytecode);
145+ auto *byteBuffer = (jbyte *) malloc (sizeof (jbyte) * bufferSize);
146+ memset (byteBuffer, 0 , sizeof (jbyte) * bufferSize);
147+
148+ env->GetByteArrayRegion (bytecode, 0 , bufferSize, byteBuffer);
149+
150+ NAPIValue result;
151+ auto status = NAPIRunByteBuffer (globalEnv, (uint8_t *) byteBuffer, bufferSize, &result);
152+ LOGD (" run bytecode status: %d" , status);
153+
154+ free (byteBuffer);
155+
156+ if (status == NAPIExceptionPendingException) {
157+ reportExceptionIfNeed (globalEnv);
158+ jstring msg = env->NewStringUTF (" JavaScript evaluate exception" );
159+ jobject obj = env->NewObject (JSUtils::jsExceptionCls, JSUtils::jsExceptionInitMethodID, msg);
160+ env->DeleteLocalRef (msg);
161+ return obj;
162+ }
163+
164+ return JSUtils::JsValueToJavaObject (globalEnv, result);
165+ }
166+
96167extern " C"
97168JNIEXPORT void JNICALL
98169Java_com_didi_hummer_core_engine_napi_jni_JSEngine_setProperty (JNIEnv *env, jclass clazz, jlong js_context, jlong js_object, jstring key, jobject value) {
0 commit comments