• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include <cstring>
16 
17 #include "ani_common_util.h"
18 
19 #include "ani_enum_convert.h"
20 #include "running_process_info.h"
21 #include "hilog_tag_wrapper.h"
22 #include "securec.h"
23 
24 namespace OHOS {
25 namespace AppExecFwk {
26 namespace {
27 constexpr const char* CLASSNAME_DOUBLE = "Lstd/core/Double;";
28 constexpr const char* CLASSNAME_BOOL = "Lstd/core/Boolean;";
29 constexpr const char* CLASSNAME_ARRAY = "Lescompat/Array;";
30 constexpr const char* CLASSNAME_LONG = "Lstd/core/Long;";
31 constexpr const char* CLASSNAME_INT = "Lstd/core/Int;";
32 constexpr const char* CLASSNAME_ASYNC_CALLBACK_WRAPPER = "Lutils/AbilityUtils/AsyncCallbackWrapper;";
33 constexpr const char* SET_OBJECT_VOID_SIGNATURE = "ILstd/core/Object;:V";
34 constexpr const char* CLASSNAME_INNER = "Lapplication/ProcessInformation/ProcessInformationInner;";
35 constexpr const char* ENUMNAME_PROCESS = "L@ohos/app/ability/appManager/appManager/ProcessState;";
36 constexpr const char* ENUMNAME_BUNDLE = "L@ohos/bundle/bundleManager/bundleManager/BundleType;";
37 }
38 
GetFieldDoubleByName(ani_env * env,ani_object object,const char * name,double & value)39 bool GetFieldDoubleByName(ani_env *env, ani_object object, const char *name, double &value)
40 {
41     if (env == nullptr) {
42         TAG_LOGE(AAFwkTag::ANI, "null env");
43         return false;
44     }
45     ani_status status = ANI_ERROR;
46     ani_ref field = nullptr;
47     if ((status = env->Object_GetFieldByName_Ref(object, name, &field)) != ANI_OK) {
48         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
49         return false;
50     }
51     ani_boolean isUndefined = ANI_TRUE;
52     if ((status = env->Reference_IsUndefined(field, &isUndefined)) != ANI_OK) {
53         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
54         return false;
55     }
56     if (isUndefined) {
57         TAG_LOGE(AAFwkTag::ANI, "%{public}s: undefined", name);
58         return false;
59     }
60     ani_double aniValue = 0.0;
61     if ((status = env->Object_CallMethodByName_Double(
62         reinterpret_cast<ani_object>(field), "doubleValue", nullptr, &aniValue)) != ANI_OK) {
63         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
64         return false;
65     }
66     value = static_cast<double>(aniValue);
67     return true;
68 }
69 
SetFieldDoubleByName(ani_env * env,ani_class cls,ani_object object,const char * name,double value)70 bool SetFieldDoubleByName(ani_env *env, ani_class cls, ani_object object, const char *name, double value)
71 {
72     if (env == nullptr) {
73         TAG_LOGE(AAFwkTag::ANI, "null env");
74         return false;
75     }
76     ani_status status = ANI_ERROR;
77     ani_field field = nullptr;
78     if ((status = env->Class_FindField(cls, name, &field)) != ANI_OK) {
79         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
80         return false;
81     }
82     ani_object obj = CreateDouble(env, value);
83     if (obj == nullptr) {
84         TAG_LOGE(AAFwkTag::ANI, "CreateDouble failed");
85         return false;
86     }
87     if ((status = env->Object_SetField_Ref(object, field, reinterpret_cast<ani_ref>(obj))) != ANI_OK) {
88         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
89         return false;
90     }
91     return true;
92 }
93 
GetFieldBoolByName(ani_env * env,ani_object object,const char * name,bool & value)94 bool GetFieldBoolByName(ani_env *env, ani_object object, const char *name, bool &value)
95 {
96     if (env == nullptr) {
97         TAG_LOGE(AAFwkTag::ANI, "null env");
98         return false;
99     }
100     ani_status status = ANI_ERROR;
101     ani_ref field = nullptr;
102     if ((status = env->Object_GetFieldByName_Ref(object, name, &field)) != ANI_OK) {
103         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
104         return false;
105     }
106     ani_boolean isUndefined = ANI_TRUE;
107     if ((status = env->Reference_IsUndefined(field, &isUndefined)) != ANI_OK) {
108         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
109         return false;
110     }
111     if (isUndefined) {
112         TAG_LOGE(AAFwkTag::ANI, "%{public}s: undefined", name);
113         return false;
114     }
115     ani_boolean aniValue = ANI_FALSE;
116     if ((status = env->Object_CallMethodByName_Boolean(
117         reinterpret_cast<ani_object>(field), "unboxed", nullptr, &aniValue)) != ANI_OK) {
118         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
119         return false;
120     }
121     value = static_cast<bool>(aniValue);
122     return true;
123 }
124 
SetFieldBoolByName(ani_env * env,ani_class cls,ani_object object,const char * name,bool value)125 bool SetFieldBoolByName(ani_env *env, ani_class cls, ani_object object, const char *name, bool value)
126 {
127     if (env == nullptr) {
128         TAG_LOGE(AAFwkTag::ANI, "null env");
129         return false;
130     }
131     ani_status status = ANI_ERROR;
132     ani_field field = nullptr;
133     if ((status = env->Class_FindField(cls, name, &field)) != ANI_OK) {
134         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
135         return false;
136     }
137     if ((status = env->Object_SetField_Boolean(object, field, value)) != ANI_OK) {
138         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
139         return false;
140     }
141     return true;
142 }
143 
GetFieldStringByName(ani_env * env,ani_object object,const char * name,std::string & value)144 bool GetFieldStringByName(ani_env *env, ani_object object, const char *name, std::string &value)
145 {
146     if (env == nullptr) {
147         TAG_LOGE(AAFwkTag::ANI, "null env");
148         return false;
149     }
150     ani_status status = ANI_ERROR;
151     ani_ref field = nullptr;
152     if ((status = env->Object_GetFieldByName_Ref(object, name, &field)) != ANI_OK) {
153         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
154         return false;
155     }
156     ani_boolean isUndefined = ANI_TRUE;
157     if ((status = env->Reference_IsUndefined(field, &isUndefined)) != ANI_OK) {
158         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
159         return false;
160     }
161     if (isUndefined) {
162         TAG_LOGE(AAFwkTag::ANI, "%{public}s: undefined", name);
163         return false;
164     }
165     if (!GetStdString(env, reinterpret_cast<ani_string>(field), value)) {
166         TAG_LOGE(AAFwkTag::ANI, "GetStdString failed");
167         return false;
168     }
169     return true;
170 }
171 
SetFieldStringByName(ani_env * env,ani_class cls,ani_object object,const char * name,const std::string & value)172 bool SetFieldStringByName(ani_env *env, ani_class cls, ani_object object, const char *name,
173     const std::string &value)
174 {
175     if (env == nullptr) {
176         TAG_LOGE(AAFwkTag::ANI, "null env");
177         return false;
178     }
179     ani_status status = ANI_ERROR;
180     ani_field field = nullptr;
181     if ((status = env->Class_FindField(cls, name, &field)) != ANI_OK) {
182         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
183         return false;
184     }
185 
186     if (value.empty()) {
187         ani_ref nullRef = nullptr;
188         if ((status = env->GetNull(&nullRef)) != ANI_OK) {
189             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
190             return false;
191         }
192         if ((status = env->Object_SetField_Ref(object, field, nullRef)) != ANI_OK) {
193             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
194             return false;
195         }
196         return true;
197     }
198     ani_string aniStr = nullptr;
199     if ((status = env->String_NewUTF8(value.c_str(), value.size(), &aniStr)) != ANI_OK) {
200         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
201         return false;
202     }
203     if ((status = env->Object_SetField_Ref(object, field, aniStr)) != ANI_OK) {
204         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
205         return false;
206     }
207     return true;
208 }
209 
GetFieldIntByName(ani_env * env,ani_object object,const char * name,int & value)210 bool GetFieldIntByName(ani_env *env, ani_object object, const char *name, int &value)
211 {
212     if (env == nullptr) {
213         TAG_LOGE(AAFwkTag::ANI, "null env");
214         return false;
215     }
216     ani_status status = ANI_ERROR;
217     ani_int aniInt = 0;
218     if ((status = env->Object_GetFieldByName_Int(object, name, &aniInt)) != ANI_OK) {
219         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
220         return false;
221     }
222     value = static_cast<int>(aniInt);
223     return true;
224 }
225 
SetFieldIntByName(ani_env * env,ani_class cls,ani_object object,const char * name,int value)226 bool SetFieldIntByName(ani_env *env, ani_class cls, ani_object object, const char *name, int value)
227 {
228     if (env == nullptr) {
229         TAG_LOGE(AAFwkTag::ANI, "null env");
230         return false;
231     }
232     ani_status status = ANI_ERROR;
233     ani_field field = nullptr;
234     if ((status = env->Class_FindField(cls, name, &field)) != ANI_OK) {
235         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
236         return false;
237     }
238     if ((status = env->Object_SetField_Int(object, field, value)) != ANI_OK) {
239         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
240         return false;
241     }
242     return true;
243 }
244 
GetFieldStringArrayByName(ani_env * env,ani_object object,const char * name,std::vector<std::string> & value)245 bool GetFieldStringArrayByName(ani_env *env, ani_object object, const char *name, std::vector<std::string> &value)
246 {
247     if (env == nullptr) {
248         TAG_LOGE(AAFwkTag::ANI, "null env");
249         return false;
250     }
251     ani_status status = ANI_ERROR;
252     ani_ref arrayObj = nullptr;
253     if ((status = env->Object_GetFieldByName_Ref(object, name, &arrayObj)) != ANI_OK) {
254         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
255         return false;
256     }
257     ani_boolean isUndefined = ANI_TRUE;
258     if ((status = env->Reference_IsUndefined(arrayObj, &isUndefined)) != ANI_OK) {
259         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
260         return false;
261     }
262     if (isUndefined) {
263         TAG_LOGE(AAFwkTag::ANI, "%{public}s: undefined", name);
264         return false;
265     }
266     ani_double length = 0;
267     if ((status = env->Object_GetPropertyByName_Double(reinterpret_cast<ani_object>(arrayObj),
268         "length", &length)) != ANI_OK) {
269         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
270         return false;
271     }
272     for (int i = 0; i < static_cast<int>(length); i++) {
273         ani_ref stringEntryRef;
274         status = env->Object_CallMethodByName_Ref(reinterpret_cast<ani_object>(arrayObj),
275             "$_get", "I:Lstd/core/Object;", &stringEntryRef, (ani_int)i);
276         if (status != ANI_OK) {
277             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d, index: %{public}d", status, i);
278             return false;
279         }
280         std::string str = "";
281         if (!GetStdString(env, reinterpret_cast<ani_string>(stringEntryRef), str)) {
282             TAG_LOGE(AAFwkTag::ANI, "GetStdString failed, index: %{public}d", i);
283             return false;
284         }
285         value.emplace_back(str);
286         TAG_LOGD(AAFwkTag::ANI, "GetStdString index: %{public}d %{public}s", i, str.c_str());
287     }
288     return true;
289 }
290 
SetFieldArrayStringByName(ani_env * env,ani_class cls,ani_object object,const char * name,const std::vector<std::string> & value)291 bool SetFieldArrayStringByName(ani_env *env, ani_class cls, ani_object object, const char *name,
292     const std::vector<std::string> &value)
293 {
294     if (env == nullptr) {
295         TAG_LOGE(AAFwkTag::ANI, "null env");
296         return false;
297     }
298     ani_status status = ANI_ERROR;
299     ani_field field = nullptr;
300     if ((status = env->Class_FindField(cls, name, &field)) != ANI_OK) {
301         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
302         return false;
303     }
304     ani_class arrayCls = nullptr;
305     if ((status = env->FindClass(CLASSNAME_ARRAY, &arrayCls)) != ANI_OK) {
306         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
307         return false;
308     }
309     ani_method arrayCtor = nullptr;
310     if ((status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor)) != ANI_OK) {
311         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
312         return false;
313     }
314     ani_object arrayObj = nullptr;
315     if ((status = env->Object_New(arrayCls, arrayCtor, &arrayObj, value.size())) != ANI_OK) {
316         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
317         return false;
318     }
319     for (size_t i = 0; i < value.size(); i++) {
320         ani_string str = nullptr;
321         if ((status = env->String_NewUTF8(value[i].c_str(), value[i].size(), &str)) != ANI_OK) {
322             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
323             return false;
324         }
325         if ((status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V",
326             i, str)) != ANI_OK) {
327             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
328             return false;
329         }
330     }
331     if ((status = env->Object_SetField_Ref(object, field, arrayObj)) != ANI_OK) {
332         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
333         return false;
334     }
335     return true;
336 }
337 
GetFieldRefByName(ani_env * env,ani_object object,const char * name,ani_ref & ref)338 bool GetFieldRefByName(ani_env *env, ani_object object, const char *name, ani_ref &ref)
339 {
340     if (env == nullptr) {
341         TAG_LOGE(AAFwkTag::ANI, "null env");
342         return false;
343     }
344     ani_status status = ANI_ERROR;
345     if ((status = env->Object_GetFieldByName_Ref(object, name, &ref)) != ANI_OK) {
346         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
347         return false;
348     }
349     ani_boolean isUndefined = ANI_TRUE;
350     if ((status = env->Reference_IsUndefined(ref, &isUndefined)) != ANI_OK) {
351         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
352         return false;
353     }
354     if (isUndefined) {
355         TAG_LOGE(AAFwkTag::ANI, "%{public}s is undefined", name);
356         return false;
357     }
358     return true;
359 }
360 
SetFieldRefByName(ani_env * env,ani_class cls,ani_object object,const char * name,ani_ref value)361 bool SetFieldRefByName(ani_env *env, ani_class cls, ani_object object, const char *name, ani_ref value)
362 {
363     if (env == nullptr) {
364         TAG_LOGE(AAFwkTag::ANI, "null env");
365         return false;
366     }
367     ani_status status = ANI_ERROR;
368     ani_field field = nullptr;
369     if ((status = env->Class_FindField(cls, name, &field)) != ANI_OK) {
370         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
371         return false;
372     }
373     if ((status = env->Object_SetField_Ref(object, field, value)) != ANI_OK) {
374         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
375         return false;
376     }
377     return true;
378 }
379 
GetStdString(ani_env * env,ani_string str,std::string & value)380 bool GetStdString(ani_env *env, ani_string str, std::string &value)
381 {
382     if (env == nullptr) {
383         TAG_LOGE(AAFwkTag::ANI, "null env");
384         return false;
385     }
386     ani_status status = ANI_ERROR;
387     ani_size sz = 0;
388     if ((status = env->String_GetUTF8Size(str, &sz)) != ANI_OK) {
389         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
390         return false;
391     }
392     value.resize(sz + 1);
393     if ((status = env->String_GetUTF8SubString(str, 0, sz, value.data(), value.size(), &sz)) != ANI_OK) {
394         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
395         return false;
396     }
397     value.resize(sz);
398     return true;
399 }
400 
GetAniString(ani_env * env,const std::string & str)401 ani_string GetAniString(ani_env *env, const std::string &str)
402 {
403     if (env == nullptr) {
404         TAG_LOGE(AAFwkTag::ANI, "null env");
405         return nullptr;
406     }
407     ani_string aniStr = nullptr;
408     ani_status status = env->String_NewUTF8(str.c_str(), str.size(), &aniStr);
409     if (status != ANI_OK) {
410         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
411         return nullptr;
412     }
413     return aniStr;
414 }
415 
CreateDouble(ani_env * env,ani_double value)416 ani_object CreateDouble(ani_env *env, ani_double value)
417 {
418     if (env == nullptr) {
419         TAG_LOGE(AAFwkTag::ANI, "null env");
420         return nullptr;
421     }
422     ani_status status = ANI_ERROR;
423     ani_class cls = nullptr;
424     if ((status = env->FindClass(CLASSNAME_DOUBLE, &cls)) != ANI_OK) {
425         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
426         return nullptr;
427     }
428     ani_method ctor = nullptr;
429     if ((status = env->Class_FindMethod(cls, "<ctor>", "D:V", &ctor)) != ANI_OK) {
430         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
431         return nullptr;
432     }
433     ani_object obj = nullptr;
434     if ((status = env->Object_New(cls, ctor, &obj, value)) != ANI_OK) {
435         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
436         return nullptr;
437     }
438     return obj;
439 }
440 
CreateBoolean(ani_env * env,ani_boolean value)441 ani_object CreateBoolean(ani_env *env, ani_boolean value)
442 {
443     if (env == nullptr) {
444         TAG_LOGE(AAFwkTag::ANI, "null env");
445         return nullptr;
446     }
447     ani_status status = ANI_ERROR;
448     ani_class cls = nullptr;
449     if ((status = env->FindClass(CLASSNAME_BOOL, &cls)) != ANI_OK) {
450         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
451         return nullptr;
452     }
453     ani_method ctor = nullptr;
454     if ((status = env->Class_FindMethod(cls, "<ctor>", "Z:V", &ctor)) != ANI_OK) {
455         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
456         return nullptr;
457     }
458     ani_object obj = nullptr;
459     if ((status = env->Object_New(cls, ctor, &obj, value)) != ANI_OK) {
460         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
461         return nullptr;
462     }
463     return obj;
464 }
465 
CreateLong(ani_env * env,ani_long value)466 ani_object CreateLong(ani_env *env, ani_long value)
467 {
468     if (env == nullptr) {
469         TAG_LOGE(AAFwkTag::ANI, "null env");
470         return nullptr;
471     }
472     ani_class cls = nullptr;
473     ani_status status = env->FindClass(CLASSNAME_LONG, &cls);
474     if (status != ANI_OK || cls == nullptr) {
475         TAG_LOGE(AAFwkTag::ANI, "FindClass status: %{public}d, or null class", status);
476         return nullptr;
477     }
478     ani_method method = nullptr;
479     if ((status = env->Class_FindMethod(cls, "<ctor>", "J:V", &method)) != ANI_OK || method == nullptr) {
480         TAG_LOGE(AAFwkTag::ANI, "Class_FindMethod status: %{public}d, or null method", status);
481         return nullptr;
482     }
483     ani_object object = nullptr;
484     if ((status = env->Object_New(cls, method, &object, value)) != ANI_OK || object == nullptr) {
485         TAG_LOGE(AAFwkTag::ANI, "Object_New status: %{public}d, or null object", status);
486         return nullptr;
487     }
488     return object;
489 }
490 
AsyncCallback(ani_env * env,ani_object call,ani_object error,ani_object result)491 bool AsyncCallback(ani_env *env, ani_object call, ani_object error, ani_object result)
492 {
493     if (env == nullptr) {
494         TAG_LOGE(AAFwkTag::ANI, "null env");
495         return false;
496     }
497     ani_class clsCall = nullptr;
498     ani_status status = env->FindClass(CLASSNAME_ASYNC_CALLBACK_WRAPPER, &clsCall);
499     if (status!= ANI_OK || clsCall == nullptr) {
500         TAG_LOGE(AAFwkTag::ANI, "FindClass status: %{public}d, or null clsCall", status);
501         return false;
502     }
503     ani_method method = nullptr;
504     if ((status = env->Class_FindMethod(clsCall, "invoke", nullptr, &method)) != ANI_OK || method == nullptr) {
505         TAG_LOGE(AAFwkTag::ANI, "Class_FindMethod status: %{public}d, or null method", status);
506         return false;
507     }
508     if (error == nullptr) {
509         ani_ref nullRef = nullptr;
510         env->GetNull(&nullRef);
511         error = reinterpret_cast<ani_object>(nullRef);
512     }
513     if (result == nullptr) {
514         ani_ref undefinedRef = nullptr;
515         env->GetUndefined(&undefinedRef);
516         result = reinterpret_cast<ani_object>(undefinedRef);
517     }
518     if ((status = env->Object_CallMethod_Void(call, method, error, result)) != ANI_OK) {
519         TAG_LOGE(AAFwkTag::ANI, "Object_CallMethod_Void status: %{public}d", status);
520         return false;
521     }
522     return true;
523 }
524 
GetDoubleOrUndefined(ani_env * env,ani_object param,const char * name,ani_double & value)525 bool GetDoubleOrUndefined(ani_env *env, ani_object param, const char *name, ani_double &value)
526 {
527     ani_ref obj = nullptr;
528     ani_boolean isUndefined = true;
529     ani_status status = ANI_ERROR;
530 
531     if  (env == nullptr || param == nullptr || name == nullptr) {
532         TAG_LOGE(AAFwkTag::ANI, "null env or param or name");
533         return false;
534     }
535 
536     if ((status = env->Object_GetFieldByName_Ref(param, name, &obj)) != ANI_OK) {
537         TAG_LOGE(AAFwkTag::ANI, "status : %{public}d", status);
538         return false;
539     }
540     if ((status = env->Reference_IsUndefined(obj, &isUndefined)) != ANI_OK) {
541         TAG_LOGE(AAFwkTag::ANI, "status : %{public}d", status);
542         return false;
543     }
544     if (isUndefined) {
545         TAG_LOGE(AAFwkTag::ANI, "%{public}s : undefined", name);
546         return false;
547     }
548     if ((status = env->Object_CallMethodByName_Double(
549         reinterpret_cast<ani_object>(obj), "doubleValue", nullptr, &value)) != ANI_OK) {
550         TAG_LOGE(AAFwkTag::ANI, "status : %{public}d", status);
551         return false;
552     }
553     return true;
554 }
555 
GetStringOrUndefined(ani_env * env,ani_object param,const char * name,std::string & res)556 bool GetStringOrUndefined(ani_env *env, ani_object param, const char *name, std::string &res)
557 {
558     ani_ref obj = nullptr;
559     ani_boolean isUndefined = true;
560     ani_status status = ANI_ERROR;
561 
562     if (env == nullptr || param == nullptr || name == nullptr) {
563         TAG_LOGE(AAFwkTag::ANI, "null env or param or name");
564         return false;
565     }
566 
567     if ((status = env->Object_GetFieldByName_Ref(param, name, &obj)) != ANI_OK) {
568         TAG_LOGE(AAFwkTag::ANI, "status : %{public}d", status);
569         return false;
570     }
571     if ((status = env->Reference_IsUndefined(obj, &isUndefined)) != ANI_OK) {
572         TAG_LOGE(AAFwkTag::ANI, "status : %{public}d", status);
573         return false;
574     }
575     if (isUndefined) {
576         TAG_LOGE(AAFwkTag::ANI, "%{public}s : undefined", name);
577         return false;
578     }
579     if (!GetStdString(env, reinterpret_cast<ani_string>(obj), res)) {
580         TAG_LOGE(AAFwkTag::ANI, "GetStdString failed");
581         return false;
582     }
583     return true;
584 }
585 
GetPropertyRef(ani_env * env,ani_object obj,const char * name,ani_ref & ref,ani_boolean & isUndefined)586 bool GetPropertyRef(ani_env *env, ani_object obj, const char *name, ani_ref &ref, ani_boolean &isUndefined)
587 {
588     if (env == nullptr) {
589         TAG_LOGE(AAFwkTag::ANI, "null env");
590         return false;
591     }
592     ani_status status = env->Object_GetPropertyByName_Ref(obj, name, &ref);
593     if (status != ANI_OK) {
594         TAG_LOGE(AAFwkTag::ANI, "Failed to get property '%{public}s', status: %{public}d", name, status);
595         return false;
596     }
597     status = env->Reference_IsUndefined(ref, &isUndefined);
598     if (status != ANI_OK) {
599         TAG_LOGE(AAFwkTag::ANI, "Failed to check undefined for '%{public}s', status: %{public}d", name, status);
600         return false;
601     }
602     return true;
603 }
604 
CreateInt(ani_env * env,ani_int value)605 ani_object CreateInt(ani_env *env, ani_int value)
606 {
607     ani_class cls;
608     ani_status status = ANI_ERROR;
609     if ((status = env->FindClass(CLASSNAME_INT, &cls)) != ANI_OK) {
610         TAG_LOGE(AAFwkTag::ANI, "FindClass status : %{public}d", status);
611         return nullptr;
612     }
613     ani_method ctor;
614     if ((status = env->Class_FindMethod(cls, "<ctor>", "I:V", &ctor)) != ANI_OK) {
615         TAG_LOGE(AAFwkTag::ANI, "Class_FindMethod status : %{public}d", status);
616         return nullptr;
617     }
618     ani_object object;
619     if ((status = env->Object_New(cls, ctor, &object, value)) != ANI_OK) {
620         TAG_LOGE(AAFwkTag::ANI, "Object_New status : %{public}d", status);
621         return nullptr;
622     }
623     return object;
624 }
625 
SetOptionalFieldInt(ani_env * env,ani_class cls,ani_object object,const std::string & fieldName,int value)626 bool SetOptionalFieldInt(ani_env *env, ani_class cls, ani_object object, const std::string &fieldName, int value)
627 {
628     ani_field field = nullptr;
629     ani_status status = env->Class_FindField(cls, fieldName.c_str(), &field);
630     if (status != ANI_OK || field == nullptr) {
631         TAG_LOGE(AAFwkTag::ANI, "Class_FindField failed or null field, status=%{public}d, fieldName=%{public}s",
632             status, fieldName.c_str());
633         return false;
634     }
635     ani_object intObj = CreateInt(env, value);
636     if (intObj == nullptr) {
637         TAG_LOGE(AAFwkTag::ANI, "null intObj");
638         return false;
639     }
640     status = env->Object_SetField_Ref(object, field, intObj);
641     if (status != ANI_OK) {
642         TAG_LOGE(AAFwkTag::ANI, "Object_SetField_Ref failed, status=%{public}d, fieldName=%{public}s",
643             status, fieldName.c_str());
644         return false;
645     }
646     return true;
647 }
648 
IsExistsField(ani_env * env,ani_object param,const char * name)649 bool IsExistsField(ani_env *env, ani_object param, const char *name)
650 {
651     if (env == nullptr) {
652         TAG_LOGE(AAFwkTag::ANI, "null env");
653         return false;
654     }
655 
656     ani_ref resRef = nullptr;
657     ani_status status;
658     ani_boolean isUndefined = true;
659 
660     if ((status = env->Object_GetFieldByName_Ref(param, name, &resRef)) != ANI_OK) {
661         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
662         return false;
663     }
664     if ((status = env->Reference_IsUndefined(resRef, &isUndefined)) != ANI_OK) {
665         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
666         return false;
667     }
668     if (isUndefined) {
669         return false;
670     }
671     return true;
672 }
673 
WrapArrayString(ani_env * env,ani_object & arrayObj,const std::vector<std::string> & values)674 bool WrapArrayString(ani_env *env, ani_object &arrayObj, const std::vector<std::string> &values)
675 {
676     if (env == nullptr) {
677         TAG_LOGE(AAFwkTag::ANI, "env null or arrayObj null");
678         return false;
679     }
680     ani_class arrayCls = nullptr;
681     ani_method arrayCtor;
682     ani_string aniStr = nullptr;
683     ani_status status = ANI_ERROR;
684     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
685     if (status != ANI_OK) {
686         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
687         return false;
688     }
689     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
690     if (status != ANI_OK) {
691         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
692         return false;
693     }
694     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, values.size());
695     if (status != ANI_OK) {
696         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
697         return false;
698     }
699 
700     for (size_t i = 0; i < values.size(); i++) {
701         aniStr = nullptr;
702         status = env->String_NewUTF8(values[i].c_str(), values[i].size(), &aniStr);
703         if (aniStr == nullptr) {
704             TAG_LOGE(AAFwkTag::ANI, "null aniStr");
705             return false;
706         }
707         if (status != ANI_OK) {
708             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
709             return false;
710         }
711         status = env->Object_CallMethodByName_Void(arrayObj, "$_set", SET_OBJECT_VOID_SIGNATURE, i, aniStr);
712         if (status != ANI_OK) {
713             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
714             return false;
715         }
716     }
717     return true;
718 }
719 
UnwrapArrayString(ani_env * env,const ani_object & arrayObj,std::vector<std::string> & stringList)720 bool UnwrapArrayString(ani_env *env, const ani_object &arrayObj, std::vector<std::string> &stringList)
721 {
722     if (env == nullptr || arrayObj == nullptr) {
723         TAG_LOGE(AAFwkTag::ANI, "env null or arrayObj null");
724         return false;
725     }
726     stringList.clear();
727     ani_size size = 0;
728     ani_status status = ANI_ERROR;
729     if ((status = env->Array_GetLength(reinterpret_cast<ani_array>(arrayObj), &size)) != ANI_OK) {
730         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
731         return false;
732     }
733     ani_ref ref;
734     ani_size idx;
735     for (idx = 0; idx < size; idx++) {
736         if ((status = env->Array_Get_Ref(reinterpret_cast<ani_array_ref>(arrayObj), idx, &ref)) != ANI_OK) {
737             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d, index: %{public}zu", status, idx);
738             return false;
739         }
740         if (ref == nullptr) {
741             TAG_LOGE(AAFwkTag::ANI, "null ref");
742             return false;
743         }
744         std::string str = "";
745         if (!OHOS::AppExecFwk::GetStdString(env, reinterpret_cast<ani_string>(ref), str)) {
746             TAG_LOGE(AAFwkTag::ANI, "GetStdString failed, index: %{public}zu", idx);
747             return false;
748         }
749         stringList.push_back(str);
750     }
751     return true;
752 }
753 
SetProcessInformation(ani_env * env,ani_object object,const AppExecFwk::RunningProcessInfo & processInfo)754 bool SetProcessInformation(ani_env *env, ani_object object, const AppExecFwk::RunningProcessInfo &processInfo)
755 {
756     if (env == nullptr) {
757         TAG_LOGE(AAFwkTag::ANI, "null env");
758         return false;
759     }
760     ani_status status = ANI_OK;
761     if ((status = env->Object_SetPropertyByName_Double(object, "pid", processInfo.pid_)) != ANI_OK) {
762         TAG_LOGE(AAFwkTag::ANI, "pid failed status:%{public}d", status);
763         return false;
764     }
765     if ((status = env->Object_SetPropertyByName_Double(object, "uid", processInfo.uid_)) != ANI_OK) {
766         TAG_LOGE(AAFwkTag::ANI, "uid failed status:%{public}d", status);
767         return false;
768     }
769     status = env->Object_SetPropertyByName_Ref(object, "processName",
770         AppExecFwk::GetAniString(env, processInfo.processName_));
771     if (status != ANI_OK) {
772         TAG_LOGE(AAFwkTag::ANI, "processName failed status:%{public}d", status);
773         return false;
774     }
775     ani_object arrayObj = nullptr;
776     WrapArrayString(env, arrayObj, processInfo.bundleNames);
777     status = env->Object_SetPropertyByName_Ref(object, "bundleNames", arrayObj);
778     if (status != ANI_OK) {
779         TAG_LOGE(AAFwkTag::ANI, "bundleNames failed status:%{public}d", status);
780         return false;
781     }
782     ani_enum_item stateItem {};
783     AAFwk::AniEnumConvertUtil::EnumConvert_NativeToEts(env,
784         ENUMNAME_PROCESS, processInfo.state_, stateItem);
785     if ((status = env->Object_SetPropertyByName_Ref(object, "state", stateItem)) != ANI_OK) {
786         TAG_LOGE(AAFwkTag::ANI, "state failed status:%{public}d", status);
787         return false;
788     }
789     ani_enum_item bundleTypeItem {};
790     AAFwk::AniEnumConvertUtil::EnumConvert_NativeToEts(env,
791         ENUMNAME_BUNDLE,
792         processInfo.bundleType, bundleTypeItem);
793     if ((status = env->Object_SetPropertyByName_Ref(object, "bundleType", bundleTypeItem)) != ANI_OK) {
794         TAG_LOGE(AAFwkTag::ANI, "bundleType failed status:%{public}d", status);
795         return false;
796     }
797     status = env->Object_SetPropertyByName_Ref(object, "appCloneIndex",
798         CreateDouble(env, processInfo.appCloneIndex));
799     if (status != ANI_OK) {
800         TAG_LOGE(AAFwkTag::ANI, "appCloneIndex failed status:%{public}d", status);
801         return false;
802     }
803     return true;
804 }
805 
WrapProcessInformation(ani_env * env,const AppExecFwk::RunningProcessInfo & processInfo)806 ani_object WrapProcessInformation(ani_env *env, const AppExecFwk::RunningProcessInfo &processInfo)
807 {
808     ani_class cls = nullptr;
809     ani_status status = ANI_ERROR;
810     ani_method method {};
811     ani_object object = nullptr;
812     if (env == nullptr) {
813         TAG_LOGE(AAFwkTag::ANI, "null env");
814         return nullptr;
815     }
816     if ((status = env->FindClass(CLASSNAME_INNER, &cls)) != ANI_OK) {
817         TAG_LOGE(AAFwkTag::ANI, "FindClass failed status: %{public}d", status);
818         return nullptr;
819     }
820     if (cls == nullptr) {
821         TAG_LOGE(AAFwkTag::ANI, "null cls");
822         return nullptr;
823     }
824     if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
825         TAG_LOGE(AAFwkTag::ANI, "find ctor failed status: %{public}d", status);
826         return nullptr;
827     }
828     if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
829         TAG_LOGE(AAFwkTag::ANI, "Object_New ProcessInformationInner failed status: %{public}d", status);
830         return nullptr;
831     }
832     if (object == nullptr) {
833         TAG_LOGE(AAFwkTag::ANI, "null object");
834         return nullptr;
835     }
836     if (!SetProcessInformation(env, object, processInfo)) {
837         TAG_LOGE(AAFwkTag::ANI, "SetProcessInformation failed");
838         return nullptr;
839     }
840     return object;
841 }
842 
CreateRunningProcessInfoArray(ani_env * env,std::vector<AppExecFwk::RunningProcessInfo> infos)843 ani_object CreateRunningProcessInfoArray(ani_env *env, std::vector<AppExecFwk::RunningProcessInfo> infos)
844 {
845     ani_class arrayCls = nullptr;
846     ani_status status = ANI_OK;
847 
848     if (env == nullptr) {
849         TAG_LOGE(AAFwkTag::ANI, "null env");
850         return nullptr;
851     }
852 
853     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
854     if (status != ANI_OK) {
855         TAG_LOGE(AAFwkTag::ANI, "FindClass failed status: %{public}d", status);
856         return nullptr;
857     }
858 
859     ani_method arrayCtor;
860     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
861     if (status != ANI_OK) {
862         TAG_LOGE(AAFwkTag::ANI, "find ctor failed status: %{public}d", status);
863         return nullptr;
864     }
865 
866     ani_object arrayObj;
867     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, infos.size());
868     if (status != ANI_OK) {
869         TAG_LOGE(AAFwkTag::ANI, "Object_New array status: %{public}d", status);
870         return arrayObj;
871     }
872     ani_size index = 0;
873     for (auto &processInfo : infos) {
874         ani_object aniInfo = WrapProcessInformation(env, processInfo);
875         if (aniInfo == nullptr) {
876             TAG_LOGW(AAFwkTag::ANI, "null aniInfo");
877             break;
878         }
879         status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, aniInfo);
880         if (status != ANI_OK) {
881             TAG_LOGW(AAFwkTag::ANI, "Object_CallMethodByName_Void failed status: %{public}d", status);
882             break;
883         }
884         index++;
885     }
886     return arrayObj;
887 }
888 
CreateEmptyArray(ani_env * env)889 ani_object CreateEmptyArray(ani_env *env)
890 {
891     ani_status status = ANI_OK;
892     if (env == nullptr) {
893         TAG_LOGE(AAFwkTag::ANI, "null env");
894         return nullptr;
895     }
896     ani_class arrayCls = nullptr;
897     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
898     if (status != ANI_OK) {
899         TAG_LOGE(AAFwkTag::ANI, "FindClass failed status: %{public}d", status);
900         return nullptr;
901     }
902     ani_method arrayCtor;
903     status = env->Class_FindMethod(arrayCls, "<ctor>", ":V", &arrayCtor);
904     if (status != ANI_OK) {
905         TAG_LOGE(AAFwkTag::ANI, "find ctor failed status: %{public}d", status);
906         return nullptr;
907     }
908     ani_object arrayObj;
909     status = env->Object_New(arrayCls, arrayCtor, &arrayObj);
910     if (status != ANI_OK) {
911         TAG_LOGE(AAFwkTag::ANI, "Object_New array failed status: %{public}d", status);
912         return nullptr;
913     }
914     return arrayObj;
915 }
916 
IsExistsProperty(ani_env * env,ani_object param,const char * name)917 bool IsExistsProperty(ani_env *env, ani_object param, const char *name)
918 {
919     if (env == nullptr) {
920         TAG_LOGE(AAFwkTag::ANI, "null env");
921         return false;
922     }
923 
924     ani_ref resRef = nullptr;
925     ani_status status = ANI_ERROR;
926     ani_boolean isUndefined = true;
927 
928     if ((status = env->Object_GetPropertyByName_Ref(param, name, &resRef)) != ANI_OK) {
929         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
930         return false;
931     }
932     if ((status = env->Reference_IsUndefined(resRef, &isUndefined)) != ANI_OK) {
933         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
934         return false;
935     }
936     return !isUndefined;
937 }
938 
GetStringProperty(ani_env * env,ani_object param,const char * name,std::string & value)939 bool GetStringProperty(ani_env *env, ani_object param, const char *name, std::string &value)
940 {
941     if (env == nullptr) {
942         TAG_LOGE(AAFwkTag::ANI, "null env");
943         return false;
944     }
945 
946     ani_ref obj = nullptr;
947     ani_boolean isUndefined = true;
948     ani_status status = ANI_ERROR;
949 
950     if ((status = env->Object_GetPropertyByName_Ref(param, name, &obj)) != ANI_OK) {
951         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
952         return false;
953     }
954     if ((status = env->Reference_IsUndefined(obj, &isUndefined)) != ANI_OK) {
955         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
956         return false;
957     }
958     if (isUndefined) {
959         TAG_LOGE(AAFwkTag::ANI, "%{public}s : undefined", name);
960         return false;
961     }
962     if (!GetStdString(env, reinterpret_cast<ani_string>(obj), value)) {
963         TAG_LOGE(AAFwkTag::ANI, "GetStdString failed");
964         return false;
965     }
966     return true;
967 }
968 
GetStringArrayProperty(ani_env * env,ani_object param,const char * name,std::vector<std::string> & value)969 bool GetStringArrayProperty(ani_env *env, ani_object param, const char *name, std::vector<std::string> &value)
970 {
971     if (env == nullptr) {
972         TAG_LOGE(AAFwkTag::ANI, "null env");
973         return false;
974     }
975 
976     ani_ref arrayObj = nullptr;
977     ani_boolean isUndefined = true;
978     ani_status status = ANI_ERROR;
979     ani_double length = 0.0;
980     std::string str;
981 
982     if ((status = env->Object_GetPropertyByName_Ref(param, name, &arrayObj)) != ANI_OK) {
983         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
984         return false;
985     }
986     if ((status = env->Reference_IsUndefined(arrayObj, &isUndefined)) != ANI_OK) {
987         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
988         return false;
989     }
990     if (isUndefined) {
991         TAG_LOGE(AAFwkTag::ANI, "%{public}s : undefined", name);
992         return false;
993     }
994 
995     status = env->Object_GetPropertyByName_Double(reinterpret_cast<ani_object>(arrayObj), "length", &length);
996     if (status != ANI_OK) {
997         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
998         return false;
999     }
1000 
1001     for (int i = 0; i < static_cast<int>(length); i++) {
1002         ani_ref stringEntryRef;
1003         status = env->Object_CallMethodByName_Ref(reinterpret_cast<ani_object>(arrayObj),
1004             "$_get", "I:Lstd/core/Object;", &stringEntryRef, (ani_int)i);
1005         if (status != ANI_OK) {
1006             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d, index: %{public}d", status, i);
1007             return false;
1008         }
1009 
1010         str = "";
1011         if (!GetStdString(env, reinterpret_cast<ani_string>(stringEntryRef), str)) {
1012             TAG_LOGE(AAFwkTag::ANI, "GetStdString failed, index: %{public}d", i);
1013             return false;
1014         }
1015 
1016         value.push_back(str);
1017         TAG_LOGI(AAFwkTag::ANI, "GetStdString index: %{public}d %{public}s", i, str.c_str());
1018     }
1019 
1020     return true;
1021 }
1022 
GetDoublePropertyObject(ani_env * env,ani_object param,const char * name,double & value)1023 bool GetDoublePropertyObject(ani_env *env, ani_object param, const char *name, double &value)
1024 {
1025     if (env == nullptr) {
1026         TAG_LOGE(AAFwkTag::ANI, "null env");
1027         return false;
1028     }
1029 
1030     ani_ref obj = nullptr;
1031     ani_status status = ANI_ERROR;
1032     if (!GetRefProperty(env, param, name, obj)) {
1033         TAG_LOGW(AAFwkTag::ANI, "%{public}s : undefined", name);
1034         return false;
1035     }
1036     if ((status = env->Object_CallMethodByName_Double(
1037         reinterpret_cast<ani_object>(obj), "doubleValue", nullptr, &value)) != ANI_OK) {
1038         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1039         return false;
1040     }
1041     return true;
1042 }
GetDoublePropertyValue(ani_env * env,ani_object param,const char * name,double & value)1043 bool GetDoublePropertyValue(ani_env *env, ani_object param, const char *name, double &value)
1044 {
1045     if (env == nullptr) {
1046         TAG_LOGE(AAFwkTag::ANI, "null env");
1047         return false;
1048     }
1049 
1050     ani_status status = ANI_ERROR;
1051     ani_double res = 0.0;
1052     if ((status = env->Object_GetPropertyByName_Double(param, name, &res)) != ANI_OK) {
1053         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1054         return false;
1055     }
1056     value = static_cast<double>(res);
1057     return true;
1058 }
1059 
GetRefProperty(ani_env * env,ani_object param,const char * name,ani_ref & value)1060 bool GetRefProperty(ani_env *env, ani_object param, const char *name, ani_ref &value)
1061 {
1062     if (env == nullptr) {
1063         TAG_LOGE(AAFwkTag::ANI, "null env");
1064         return false;
1065     }
1066 
1067     ani_status status = ANI_ERROR;
1068     ani_boolean isUndefined = true;
1069 
1070     if ((status = env->Object_GetPropertyByName_Ref(param, name, &value)) != ANI_OK) {
1071         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1072         return false;
1073     }
1074     if ((status = env->Reference_IsUndefined(value, &isUndefined)) != ANI_OK) {
1075         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1076         return false;
1077     }
1078     return !isUndefined;
1079 }
1080 
SetDoublePropertyObject(ani_env * env,ani_object param,const char * name,double value)1081 bool SetDoublePropertyObject(ani_env *env, ani_object param, const char *name, double value)
1082 {
1083     if (env == nullptr) {
1084         TAG_LOGE(AAFwkTag::ANI, "null env");
1085         return false;
1086     }
1087 
1088     ani_object obj = CreateDouble(env, static_cast<ani_double>(value));
1089     if (obj == nullptr) {
1090         TAG_LOGE(AAFwkTag::ANI, "null obj");
1091         return false;
1092     }
1093 
1094     ani_status status = ANI_ERROR;
1095     if ((status = env->Object_SetPropertyByName_Ref(param, name, obj)) != ANI_OK) {
1096         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1097         return false;
1098     }
1099     return true;
1100 }
1101 
SetDoublePropertyValue(ani_env * env,ani_object param,const char * name,double value)1102 bool SetDoublePropertyValue(ani_env *env, ani_object param, const char *name, double value)
1103 {
1104     if (env == nullptr) {
1105         TAG_LOGE(AAFwkTag::ANI, "null env");
1106         return false;
1107     }
1108 
1109     ani_status status = ANI_ERROR;
1110     if ((status = env->Object_SetPropertyByName_Double(param, name, value)) != ANI_OK) {
1111         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1112         return false;
1113     }
1114     return true;
1115 }
1116 
SetStringArrayProperty(ani_env * env,ani_object param,const char * name,const std::vector<std::string> & values)1117 bool SetStringArrayProperty(ani_env *env, ani_object param, const char *name, const std::vector<std::string> &values)
1118 {
1119     if (env == nullptr) {
1120         TAG_LOGE(AAFwkTag::ANI, "null env");
1121         return false;
1122     }
1123 
1124     ani_class arrayCls = nullptr;
1125     ani_method arrayCtor = nullptr;
1126     ani_object arrayObj = nullptr;
1127     ani_string string = nullptr;
1128 
1129     ani_status status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
1130     if (status != ANI_OK) {
1131         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1132         return false;
1133     }
1134 
1135     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
1136     if (status != ANI_OK) {
1137         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1138         return false;
1139     }
1140 
1141     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, values.size());
1142     if (status != ANI_OK) {
1143         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1144         return false;
1145     }
1146 
1147     for (size_t i = 0; i < values.size(); i++) {
1148         string = nullptr;
1149         status = env->String_NewUTF8(values[i].c_str(), values[i].size(), &string);
1150         if (status != ANI_OK) {
1151             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1152             return false;
1153         }
1154 
1155         status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", i, string);
1156         if (status != ANI_OK) {
1157             TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1158             return false;
1159         }
1160     }
1161     status = env->Object_SetPropertyByName_Ref(param, name, arrayObj);
1162     if (status != ANI_OK) {
1163         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1164         return false;
1165     }
1166 
1167     return true;
1168 }
1169 
SetRefProperty(ani_env * env,ani_object param,const char * name,ani_ref value)1170 bool SetRefProperty(ani_env *env, ani_object param, const char *name, ani_ref value)
1171 {
1172     if (env == nullptr) {
1173         TAG_LOGE(AAFwkTag::ANI, "null env");
1174         return false;
1175     }
1176 
1177     ani_status status = ANI_ERROR;
1178     if ((status = env->Object_SetPropertyByName_Ref(param, name, value)) != ANI_OK) {
1179         TAG_LOGE(AAFwkTag::ANI, "status: %{public}d", status);
1180         return false;
1181     }
1182     return true;
1183 }
1184 
GetStaticFieldString(ani_env * env,ani_class classObj,const char * fieldName,std::string & value)1185 bool GetStaticFieldString(ani_env *env, ani_class classObj, const char *fieldName, std::string &value)
1186 {
1187     if (env == nullptr) {
1188         TAG_LOGE(AAFwkTag::JSNAPI, "null env");
1189         return false;
1190     }
1191 
1192     ani_status status = ANI_ERROR;
1193     ani_static_field field {};
1194     if ((status = env->Class_FindStaticField(classObj, fieldName, &field)) != ANI_OK) {
1195         TAG_LOGE(AAFwkTag::JSNAPI, "Class_FindStaticField status: %{public}d", status);
1196         return false;
1197     }
1198 
1199     ani_ref obj = nullptr;
1200     if ((status = env->Class_GetStaticField_Ref(classObj, field, &obj)) != ANI_OK) {
1201         TAG_LOGE(AAFwkTag::JSNAPI, "Class_GetStaticField_Ref status: %{public}d", status);
1202         return false;
1203     }
1204 
1205     ani_boolean isUndefined = true;
1206     if ((status = env->Reference_IsUndefined(obj, &isUndefined)) != ANI_OK) {
1207         TAG_LOGE(AAFwkTag::JSNAPI, "status: %{public}d", status);
1208         return false;
1209     }
1210     if (isUndefined) {
1211         TAG_LOGE(AAFwkTag::JSNAPI, "%{public}s : undefined", fieldName);
1212         return false;
1213     }
1214 
1215     if (!AppExecFwk::GetStdString(env, reinterpret_cast<ani_string>(obj), value)) {
1216         TAG_LOGE(AAFwkTag::JSNAPI, "GetStdString failed");
1217         return false;
1218     }
1219     return true;
1220 }
1221 } // namespace AppExecFwk
1222 } // namespace OHOS
1223