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