# JSVM-API常è§é—®é¢˜ ## 定ä½æ–¹æ³• 程åºå´©æºƒç±»é—®é¢˜ï¼šé€šè¿‡C++å´©æºƒæ—¶è°ƒç”¨æ ˆæŸ¥è¯¢FAQçš„æ–¹å¼å®šä½ä»£ç 问题 程åºæ‰§è¡Œç»“æžœä¸ç¬¦åˆé¢„期类问题:需应用通过JSVM-API调用返回值定ä½åˆ°æ‰§è¡Œå¤±è´¥æˆ–执行结果ä¸ç¬¦åˆé¢„期的ä½ç½®ï¼Œé€šè¿‡å‡½æ•°å查询FAQ ## 程åºå´©æºƒç±» 1. Q:在`OH_JSVM_RunScript`或`OH_JSVM_CallFunction`æ—¶crashï¼Œè°ƒç”¨æ ˆé¡¶å±‚ä¸º`SetReturnValue` ``` #00 pc 0000000000c68ef0 /system/lib64/ndk/libjsvm.so(v8impl::(anonymous namespace)::FunctionCallbackWrapper::SetReturnValue(JSVM_Value__*)+16) #01 pc 0000000000c5ad30 /system/lib64/ndk/libjsvm.so(v8impl::(anonymous namespace)::FunctionCallbackWrapper::Invoke(v8::FunctionCallbackInfo<v8::Value> const&)+332) #02 pc 00000000014a9e58 /system/lib64/ndk/libjsvm.so #03 pc 00000000014a95d4 /system/lib64/ndk/libjsvm.so(v8::internal::Builtin_HandleApiCall(int, unsigned long*, v8::internal::Isolate*)+176) #04 pc 0000000000f7dab4 /system/lib64/ndk/libjsvm.so(Builtins_CEntry_Return1_ArgvOnStack_BuiltinExit+84) #05 pc 0000000000eece40 /system/lib64/ndk/libjsvm.so(Builtins_InterpreterEntryTrampoline+288) #06 pc 0000000000eece40 /system/lib64/ndk/libjsvm.so(Builtins_InterpreterEntryTrampoline+288) #07 pc 0000000000eece40 /system/lib64/ndk/libjsvm.so(Builtins_InterpreterEntryTrampoline+288) #08 pc 0000000000eece40 /system/lib64/ndk/libjsvm.so(Builtins_InterpreterEntryTrampoline+288) #09 pc 0000000000eece40 /system/lib64/ndk/libjsvm.so(Builtins_InterpreterEntryTrampoline+288) #10 pc 0000000000eece40 /system/lib64/ndk/libjsvm.so(Builtins_InterpreterEntryTrampoline+288) #11 pc 0000000000eece40 /system/lib64/ndk/libjsvm.so(Builtins_InterpreterEntryTrampoline+288) #12 pc 0000000000eece40 /system/lib64/ndk/libjsvm.so(Builtins_InterpreterEntryTrampoline+288) #13 pc 0000000000fe09f4 /system/lib64/ndk/libjsvm.so(Builtins_PromiseFulfillReactionJob+52) #14 pc 0000000000f155c0 /system/lib64/ndk/libjsvm.so(Builtins_RunMicrotasks+672) #15 pc 0000000000eeab54 /system/lib64/ndk/libjsvm.so(Builtins_JSRunMicrotasksEntry+148) #16 pc 00000000015bed78 /system/lib64/ndk/libjsvm.so(v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&)+2520) #17 pc 00000000015bf50c /system/lib64/ndk/libjsvm.so(v8::internal::(anonymous namespace)::InvokeWithTryCatch(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&)+104) #18 pc 00000000015bf730 /system/lib64/ndk/libjsvm.so(v8::internal::Execution::TryRunMicrotasks(v8::internal::Isolate*, v8::internal::MicrotaskQueue*)+80) #19 pc 00000000015ecf4c /system/lib64/ndk/libjsvm.so(v8::internal::MicrotaskQueue::RunMicrotasks(v8::internal::Isolate*)+312) #20 pc 00000000015ecd9c /system/lib64/ndk/libjsvm.so(v8::internal::MicrotaskQueue::PerformCheckpointInternal(v8::Isolate*)+52) #21 pc 00000000015deaa0 /system/lib64/ndk/libjsvm.so(v8::internal::Isolate::FireCallCompletedCallbackInternal(v8::internal::MicrotaskQueue*)+280) #22 pc 00000000014334e8 /system/lib64/ndk/libjsvm.so(v8::CallDepthScope<true>::~CallDepthScope()+248) #23 pc 00000000014330a4 /system/lib64/ndk/libjsvm.so(v8::Script::Run(v8::Local<v8::Context>, v8::Local<v8::Data>)+884) #24 pc 0000000000c5c2ac /system/lib64/ndk/libjsvm.so(OH_JSVM_RunScript+272) ``` A:`SetReturnValue`用于设置js函数的返回值,在js完æˆæ³¨å…¥çš„native函数调用åŽè§¦å‘。需检查native函数的返回值是å¦æ£ç¡®ï¼Œå¦‚返回值(类型`JSVM_Value`)是å¦æœªåˆå§‹åŒ–就直接返回。 2. Q:js执行虚拟机åˆå§‹åŒ–注入的native函数时程åºå´©æºƒ A:检查`JSVM_CallbackStruct`是å¦ä¸ºæ ˆä¸Šå˜é‡ï¼Œè·¨å‡½æ•°ä½¿ç”¨æ—¶éœ€ä¿è¯`JSVM_CallbackStruct`生命周期 >`JSVM_Env`的生命周期 ``` func { ... JSVM_CallbackStruct param[] = { {.data = nullptr, .callback = ConsoleInfo}, {.data = nullptr, .callback = Add}, }; JSVM_PropertyDescriptor descriptor[] = { {"consoleinfo", NULL, ¶m[0], NULL, NULL, NULL, JSVM_DEFAULT}, {"add", NULL, ¶m[1], NULL, NULL, NULL, JSVM_DEFAULT}, }; // create env, register native method, and open env scope JSVM_Env env; OH_JSVM_CreateEnv(vm, sizeof(descriptor) / sizeof(descriptor[0]), descriptor, &env); ... OH_JSVM_DestroyEnv(env); ... } ``` æ ·ä¾‹ä¸çš„代ç 结构如上,JS引擎实例在函数结æŸå‰è¢«å…³é—,所以å¯ä»¥ç›´æŽ¥ä½¿ç”¨æ ˆä¸Šçš„`param`。 3. Q:`OH_JSVM_ReferenceRef`ã€`OH_JSVM_ReferenceUnRef`ã€`OH_JSVM_CreateReference`ã€`OH_JSVM_DeleteReference`时程åºå´©æºƒ A:检查是å¦åŒæ—¶æœ‰å¤šä¸ªçº¿ç¨‹æŒæœ‰å’Œé‡Šæ”¾`JSVM_Ref`ï¼Œè§ [多线程共享引擎实例](jsvm-guidelines.md#多线程共享引擎实例) 4. Q:在虚拟机引擎实例ä¸åˆ›å»ºJS类型实例崩溃(如`OH_JSVM_CreateDouble`ï¼‰ï¼Œè°ƒç”¨æ ˆå¦‚ä¸‹ ``` #00 pc 0000000001d209e4/system/1ib64/ndk/libjsvm.so(v8::base::0S::Abort()+28) #01 pc 0000000001408480/system/lib64/ndk/libjsvm.so(v8::Utils::ReportApiFailure(char const*,char const*)+124) #02 pc 00000000015c99b8/system/lib64/ndk/libjsvm.so(v8::internal::Handlescope::Extend(v8::internal::Isolate*+200) ``` A:检查HandleScope的使用是å¦æ£ç¡®ï¼Œè§[生命周期管ç†](jsvm-guidelines.md#生命周期管ç†) ## JSVM-API执行失败类 1. Q:`OH_JSVM_GetCbInfo`çš„æ— æ³•èŽ·å–JS函数å‚æ•° Aï¼šæ£€æŸ¥å‡½æ•°ä¼ é€’çš„å‚数是å¦æ£ç¡®ï¼Œè§[获å–JSä¼ å…¥å‚æ•°åŠå…¶æ•°é‡](jsvm-guidelines.md#获å–jsä¼ å…¥å‚æ•°åŠå…¶æ•°é‡) 2. Q:`OH_JSVM_CreateFunction`ç‰å‡½æ•°è°ƒç”¨å¤±è´¥ï¼Œè¿”回值为`JSVM_PENDING_EXCEPTION` A:`JSVM_PENDING_EXCEPTION`表明当å‰è™šæ‹ŸæœºçŽ¯å¢ƒä¸å˜åœ¨æœªå¤„ç†çš„异常,å¯èƒ½æ˜¯ç”±äºŽæœ¬æ¬¡è°ƒç”¨äº§ç”Ÿçš„`JS`异常,也å¯èƒ½æ˜¯ä¹‹å‰è°ƒç”¨äº§ç”Ÿçš„未被清ç†çš„异常。å¯ä»¥é€šè¿‡åœ¨å‡½æ•°è°ƒç”¨å‰æ’å…¥`OH_JSVM_GetAndClearLastException`排查之å‰æ˜¯å¦æœ‰æœªæ¸…除的异常。如果为之å‰çš„未清ç†å¼‚常,检查是å¦æœ‰JSVM接å£è°ƒç”¨æœªå¤„ç†å¼‚常返回值;如未本次产生的异常,需清ç†å¼‚常,é¿å…å½±å“åŽç»çš„函数调用。获å–并清ç†å¼‚常的函数为`OH_JSVM_GetAndClearLastException` 3. Q:JSæ‰§è¡Œæ—¶æ— æ³•æ‰¾åˆ° `OH_JSVM_DefineClass` 定义的类 A:检查是å¦å°†å®šä¹‰çš„类绑定到上下文ä¸ï¼Œè§[上下文绑定对象](jsvm-guidelines.md#上下文绑定对象)