• 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 
16 #include "ets_app_manager_utils.h"
17 
18 #include <cstdint>
19 #include <vector>
20 
21 #include "ani_common_util.h"
22 #include "ani_enum_convert.h"
23 #include "ets_error_utils.h"
24 #include "hilog_tag_wrapper.h"
25 
26 namespace OHOS {
27 namespace AppManagerEts {
28 namespace {
29 constexpr const char* DATA_CLASS_NAME = "Lapplication/AppStateData/AppStateData;";
30 constexpr const char* CLASSNAME_ARRAY = "Lescompat/Array;";
31 constexpr const char* INFO_INNER_CLASS_NAME = "Lapplication/RunningMultiAppInfo/RunningMultiAppInfoInner;";
32 constexpr const char* INSTANCE_INNER_CLASS_NAME = "Lapplication/RunningMultiAppInfo/RunningMultiInstanceInfoInner;";
33 constexpr const char* CLONE_INNER_CLASS_NAME = "Lapplication/RunningMultiAppInfo/RunningAppCloneInner;";
34 constexpr const char *PROCESS_DATA_CLASS_NAME = "Lapplication/ProcessData/ProcessData;";
35 constexpr const char *MULTI_APP_MODE_ENUM_NAME = "Lapplication/MultiAppMode/MultiAppMode;";
36 }  // namespace
37 
WrapAppStateData(ani_env * env,const AppExecFwk::AppStateData & appStateData)38 ani_object WrapAppStateData(ani_env *env, const AppExecFwk::AppStateData &appStateData)
39 {
40     ani_class cls = nullptr;
41     ani_status status = ANI_ERROR;
42     ani_method method = nullptr;
43     ani_object object = nullptr;
44     if (env == nullptr) {
45         TAG_LOGE(AAFwkTag::APPMGR, "null env");
46         return nullptr;
47     }
48     if ((status = env->FindClass(DATA_CLASS_NAME, &cls)) != ANI_OK) {
49         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
50         return nullptr;
51     }
52     if (cls == nullptr) {
53         TAG_LOGE(AAFwkTag::APPMGR, "null cls");
54         return nullptr;
55     }
56     if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
57         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
58         return nullptr;
59     }
60     if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
61         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
62         return nullptr;
63     }
64     if (object == nullptr) {
65         TAG_LOGE(AAFwkTag::APPMGR, "null object");
66         return nullptr;
67     }
68     if (!SetAppStateData(env, object, appStateData)) {
69         TAG_LOGE(AAFwkTag::APPMGR, "SetAppStateData failed");
70         return nullptr;
71     }
72     return object;
73 }
74 
SetAppStateData(ani_env * env,ani_object object,const AppExecFwk::AppStateData & appStateData)75 bool SetAppStateData(ani_env *env, ani_object object, const AppExecFwk::AppStateData &appStateData)
76 {
77     if (env == nullptr) {
78         TAG_LOGE(AAFwkTag::APPMGR, "null env");
79         return false;
80     }
81     ani_status status = ANI_OK;
82     status = env->Object_SetFieldByName_Ref(
83         object, "bundleName", OHOS::AppExecFwk::GetAniString(env, appStateData.bundleName));
84     if (status != ANI_OK) {
85         TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
86         return false;
87     }
88     status = env->Object_SetFieldByName_Double(object, "uid", static_cast<double>(appStateData.uid));
89     if (status != ANI_OK) {
90         TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
91         return false;
92     }
93     status = env->Object_SetFieldByName_Double(object, "state", static_cast<double>(appStateData.state));
94     if (status != ANI_OK) {
95         TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
96         return false;
97     }
98     status = env->Object_SetFieldByName_Boolean(object, "isSplitScreenMode", appStateData.isSplitScreenMode);
99     if (status != ANI_OK) {
100         TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
101         return false;
102     }
103     status = env->Object_SetFieldByName_Boolean(object, "isFloatingWindowMode", appStateData.isFloatingWindowMode);
104     if (status != ANI_OK) {
105         TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
106         return false;
107     }
108     return true;
109 }
110 
CreateAppStateDataArray(ani_env * env,const std::vector<AppExecFwk::AppStateData> & data)111 ani_object CreateAppStateDataArray(ani_env *env, const std::vector<AppExecFwk::AppStateData> &data)
112 {
113     ani_class arrayCls = nullptr;
114     ani_status status = ANI_OK;
115     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
116     if (status != ANI_OK) {
117         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
118         return nullptr;
119     }
120 
121     ani_method arrayCtor = nullptr;
122     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
123     if (status != ANI_OK) {
124         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
125         return nullptr;
126     }
127 
128     ani_object arrayObj = nullptr;
129     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, data.size());
130     if (status != ANI_OK) {
131         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
132         return arrayObj;
133     }
134 
135     ani_size index = 0;
136     for (auto &appStateData : data) {
137         ani_ref aniData = WrapAppStateData(env, appStateData);
138         if (aniData == nullptr) {
139             TAG_LOGE(AAFwkTag::APPMGR, "null aniData");
140             break;
141         }
142         status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, aniData);
143         if (status != ANI_OK) {
144             TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
145             break;
146         }
147         index++;
148     }
149     return arrayObj;
150 }
151 
NewArrayClass(ani_env * env,const std::vector<std::string> & data)152 ani_object NewArrayClass(ani_env *env, const std::vector<std::string> &data)
153 {
154     ani_class arrayCls = nullptr;
155     ani_status status = ANI_OK;
156     if (env == nullptr) {
157         TAG_LOGE(AAFwkTag::APPMGR, "null env");
158         return nullptr;
159     }
160     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
161     if (status != ANI_OK) {
162         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
163         return nullptr;
164     }
165 
166     ani_method arrayCtor = nullptr;
167     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
168     if (status != ANI_OK) {
169         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
170         return nullptr;
171     }
172 
173     ani_object arrayObj = nullptr;
174     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, data.size());
175     if (status != ANI_OK) {
176         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
177         return arrayObj;
178     }
179 
180     ani_size index = 0;
181     for (auto &item : data) {
182         ani_string aniString;
183         status = env->String_NewUTF8(item.c_str(), item.size(), &aniString);
184         if (status != ANI_OK) {
185             TAG_LOGE(AAFwkTag::APPMGR, "String_NewUTF8 failed status : %{public}d", status);
186             break;
187         }
188         status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, aniString);
189         if (status != ANI_OK) {
190             TAG_LOGE(AAFwkTag::APPMGR, "Object_CallMethodByName_Void failed status : %{public}d", status);
191             break;
192         }
193         index++;
194     }
195     return arrayObj;
196 }
197 
CreateEmptyAniArray(ani_env * env)198 ani_object CreateEmptyAniArray(ani_env *env)
199 {
200     ani_class arrayCls = nullptr;
201     ani_status status = ANI_OK;
202 
203     if (env == nullptr) {
204         TAG_LOGE(AAFwkTag::APPMGR, "null env");
205         return nullptr;
206     }
207 
208     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
209     if (status != ANI_OK) {
210         TAG_LOGE(AAFwkTag::APPMGR, "FindClass failed status : %{public}d", status);
211         return nullptr;
212     }
213 
214     ani_method arrayCtor = nullptr;
215     status = env->Class_FindMethod(arrayCls, "<ctor>", ":V", &arrayCtor);
216     if (status != ANI_OK) {
217         TAG_LOGE(AAFwkTag::APPMGR, "find ctor failed status : %{public}d", status);
218         return nullptr;
219     }
220 
221     ani_object arrayObj = nullptr;
222     status = env->Object_New(arrayCls, arrayCtor, &arrayObj);
223     if (status != ANI_OK) {
224         TAG_LOGE(AAFwkTag::APPMGR, "Object_New array failed status : %{public}d", status);
225         return arrayObj;
226     }
227     return arrayObj;
228 }
229 
CreateEmptyMultiAppInfo(ani_env * env)230 ani_object CreateEmptyMultiAppInfo(ani_env *env)
231 {
232     ani_class cls = nullptr;
233     ani_status status = ANI_ERROR;
234     ani_method method = nullptr;
235     ani_object object = nullptr;
236     if (env == nullptr) {
237         TAG_LOGE(AAFwkTag::APPMGR, "null env");
238         return nullptr;
239     }
240     if ((status = env->FindClass(INFO_INNER_CLASS_NAME, &cls)) != ANI_OK) {
241         TAG_LOGE(AAFwkTag::APPMGR, "FindClass failed status : %{public}d", status);
242         return nullptr;
243     }
244     if (cls == nullptr) {
245         TAG_LOGE(AAFwkTag::APPMGR, "null cls");
246         return nullptr;
247     }
248     if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
249         TAG_LOGE(AAFwkTag::APPMGR, "find ctor failed status : %{public}d", status);
250         return nullptr;
251     }
252     if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
253         TAG_LOGE(AAFwkTag::APPMGR, "Object_New failed status : %{public}d", status);
254         return nullptr;
255     }
256     if (object == nullptr) {
257         TAG_LOGE(AAFwkTag::APPMGR, "null object");
258         return nullptr;
259     }
260     return object;
261 }
262 
CreateRunningMultiInstanceInfoArray(ani_env * env,const std::vector<AppExecFwk::RunningMultiInstanceInfo> & infos)263 ani_object CreateRunningMultiInstanceInfoArray(ani_env *env,
264     const std::vector<AppExecFwk::RunningMultiInstanceInfo> &infos)
265 {
266     ani_class arrayCls = nullptr;
267     ani_status status = ANI_OK;
268 
269     if (env == nullptr) {
270         TAG_LOGE(AAFwkTag::APPMGR, "null env");
271         return nullptr;
272     }
273 
274     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
275     if (status != ANI_OK) {
276         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
277         return nullptr;
278     }
279 
280     ani_method arrayCtor = nullptr;
281     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
282     if (status != ANI_OK) {
283         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
284         return nullptr;
285     }
286 
287     ani_object arrayObj = nullptr;
288     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, infos.size());
289     if (status != ANI_OK) {
290         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
291         return arrayObj;
292     }
293 
294     ani_size index = 0;
295     for (auto &instanceInfo : infos) {
296         ani_ref ani_info = WrapRunningMultiInstanceInfo(env, instanceInfo);
297         if (ani_info == nullptr) {
298             TAG_LOGE(AAFwkTag::APPMGR, "null ani_info");
299             break;
300         }
301         status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, ani_info);
302         if (status != ANI_OK) {
303             TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
304             break;
305         }
306         index++;
307     }
308     return arrayObj;
309 }
310 
CreateRunningAppCloneArray(ani_env * env,const std::vector<AppExecFwk::RunningAppClone> & infos)311 ani_object CreateRunningAppCloneArray(ani_env *env, const std::vector<AppExecFwk::RunningAppClone> &infos)
312 {
313     ani_class arrayCls = nullptr;
314     ani_status status = ANI_OK;
315 
316     if (env == nullptr) {
317         TAG_LOGE(AAFwkTag::APPMGR, "null env");
318         return nullptr;
319     }
320 
321     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
322     if (status != ANI_OK) {
323         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
324         return nullptr;
325     }
326 
327     ani_method arrayCtor = nullptr;
328     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
329     if (status != ANI_OK) {
330         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
331         return nullptr;
332     }
333 
334     ani_object arrayObj = nullptr;
335     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, infos.size());
336     if (status != ANI_OK) {
337         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
338         return arrayObj;
339     }
340 
341     ani_size index = 0;
342     for (auto &runningAppclone : infos) {
343         ani_ref ani_info = WrapRunningAppClone(env, runningAppclone);
344         if (ani_info == nullptr) {
345             TAG_LOGE(AAFwkTag::APPMGR, "null ani_info");
346             break;
347         }
348         status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", index, ani_info);
349         if (status != ANI_OK) {
350             TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
351             break;
352         }
353         index++;
354     }
355     return arrayObj;
356 }
357 
SetRunningMultiAppInfo(ani_env * env,ani_object object,const AppExecFwk::RunningMultiAppInfo & runningMultiAppInfo)358 bool SetRunningMultiAppInfo(ani_env *env, ani_object object, const AppExecFwk::RunningMultiAppInfo &runningMultiAppInfo)
359 {
360     if (env == nullptr) {
361         TAG_LOGE(AAFwkTag::APPMGR, "null env");
362         return false;
363     }
364     ani_status status = env->Object_SetPropertyByName_Ref(
365         object, "bundleName", OHOS::AppExecFwk::GetAniString(env, runningMultiAppInfo.bundleName));
366     if (status != ANI_OK) {
367         TAG_LOGE(AAFwkTag::APPMGR, "bundleName failed status:%{public}d", status);
368         return false;
369     }
370     ani_enum_item modeItem = nullptr;
371     OHOS::AAFwk::AniEnumConvertUtil::EnumConvert_NativeToEts(
372         env, MULTI_APP_MODE_ENUM_NAME, runningMultiAppInfo.mode, modeItem);
373     status = env->Object_SetPropertyByName_Ref(object, "mode", modeItem);
374     if (status != ANI_OK) {
375         TAG_LOGE(AAFwkTag::APPMGR, "mode failed status:%{public}d", status);
376         return false;
377     }
378     status = env->Object_SetPropertyByName_Ref(object,
379         "runningMultiInstances",
380         CreateRunningMultiInstanceInfoArray(env, runningMultiAppInfo.runningMultiIntanceInfos));
381     if (status != ANI_OK) {
382         TAG_LOGE(AAFwkTag::APPMGR, "runningMultiInstances failed status:%{public}d", status);
383         return false;
384     }
385     status = env->Object_SetPropertyByName_Ref(
386         object, "runningAppClones", CreateRunningAppCloneArray(env, runningMultiAppInfo.runningAppClones));
387     if (status != ANI_OK) {
388         TAG_LOGE(AAFwkTag::APPMGR, "runningAppClones failed status:%{public}d", status);
389         return false;
390     }
391     return true;
392 }
393 
WrapRunningMultiAppInfo(ani_env * env,const AppExecFwk::RunningMultiAppInfo & runningMultiAppInfo)394 ani_object WrapRunningMultiAppInfo(ani_env *env, const AppExecFwk::RunningMultiAppInfo &runningMultiAppInfo)
395 {
396     ani_class cls = nullptr;
397     ani_status status = ANI_ERROR;
398     ani_method method = nullptr;
399     ani_object object = nullptr;
400     if (env == nullptr) {
401         TAG_LOGE(AAFwkTag::APPMGR, "null env");
402         return nullptr;
403     }
404     if ((status = env->FindClass(INFO_INNER_CLASS_NAME, &cls)) != ANI_OK) {
405         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
406         return nullptr;
407     }
408     if (cls == nullptr) {
409         TAG_LOGE(AAFwkTag::APPMGR, "null cls");
410         return nullptr;
411     }
412     if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
413         TAG_LOGE(AAFwkTag::APPMGR, "find ctor failed status : %{public}d", status);
414         return nullptr;
415     }
416     if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
417         TAG_LOGE(AAFwkTag::APPMGR, "Object_New failed status : %{public}d", status);
418         return nullptr;
419     }
420     if (object == nullptr) {
421         TAG_LOGE(AAFwkTag::APPMGR, "null object");
422         return nullptr;
423     }
424     if (!SetRunningMultiAppInfo(env, object, runningMultiAppInfo)) {
425         TAG_LOGE(AAFwkTag::APPMGR, "SetRunningMultiAppInfo failed");
426         return nullptr;
427     }
428     return object;
429 }
430 
WrapRunningMultiInstanceInfo(ani_env * env,const AppExecFwk::RunningMultiInstanceInfo & instanceInfo)431 ani_object WrapRunningMultiInstanceInfo(ani_env *env, const AppExecFwk::RunningMultiInstanceInfo &instanceInfo)
432 {
433     ani_class cls = nullptr;
434     ani_status status = ANI_ERROR;
435     ani_method method = nullptr;
436     ani_object object = nullptr;
437     if (env == nullptr) {
438         TAG_LOGE(AAFwkTag::APPMGR, "null env");
439         return nullptr;
440     }
441     if ((status = env->FindClass(INSTANCE_INNER_CLASS_NAME, &cls)) != ANI_OK) {
442         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
443         return nullptr;
444     }
445     if (cls == nullptr) {
446         TAG_LOGE(AAFwkTag::APPMGR, "null cls");
447         return nullptr;
448     }
449     if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
450         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
451         return nullptr;
452     }
453     if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
454         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
455         return nullptr;
456     }
457     if (object == nullptr) {
458         TAG_LOGE(AAFwkTag::APPMGR, "null object");
459         return nullptr;
460     }
461     if (!SetRunningMultiInstanceInfo(env, object, instanceInfo)) {
462         TAG_LOGE(AAFwkTag::APPMGR, "SetRunningMultiInstanceInfo failed");
463         return nullptr;
464     }
465     return object;
466 }
467 
SetRunningMultiInstanceInfo(ani_env * env,ani_object object,const AppExecFwk::RunningMultiInstanceInfo & instanceInfo)468 bool SetRunningMultiInstanceInfo(
469     ani_env *env, ani_object object, const AppExecFwk::RunningMultiInstanceInfo &instanceInfo)
470 {
471     if (env == nullptr) {
472         TAG_LOGE(AAFwkTag::APPMGR, "null env");
473         return false;
474     }
475     ani_status status = env->Object_SetPropertyByName_Ref(
476         object, "instanceKey", OHOS::AppExecFwk::GetAniString(env, instanceInfo.instanceKey));
477     if (status != ANI_OK) {
478         TAG_LOGE(AAFwkTag::APPMGR, "failed status:%{public}d", status);
479         return false;
480     }
481     return true;
482 }
483 
WrapRunningAppClone(ani_env * env,const AppExecFwk::RunningAppClone & runningAppClone)484 ani_object WrapRunningAppClone(ani_env *env, const AppExecFwk::RunningAppClone &runningAppClone)
485 {
486     ani_class cls = nullptr;
487     ani_status status = ANI_ERROR;
488     ani_method method = nullptr;
489     ani_object object = nullptr;
490     if (env == nullptr) {
491         TAG_LOGE(AAFwkTag::APPMGR, "null env");
492         return nullptr;
493     }
494     if ((status = env->FindClass(CLONE_INNER_CLASS_NAME, &cls)) != ANI_OK) {
495         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
496         return nullptr;
497     }
498     if (cls == nullptr) {
499         TAG_LOGE(AAFwkTag::APPMGR, "null cls");
500         return nullptr;
501     }
502     if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
503         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
504         return nullptr;
505     }
506     if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
507         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
508         return nullptr;
509     }
510     if (object == nullptr) {
511         TAG_LOGE(AAFwkTag::APPMGR, "null object");
512         return nullptr;
513     }
514     if (!SetRunningAppClone(env, object, runningAppClone)) {
515         TAG_LOGE(AAFwkTag::APPMGR, "SetRunningAppClone failed");
516         return nullptr;
517     }
518     return object;
519 }
520 
SetRunningAppClone(ani_env * env,ani_object object,const AppExecFwk::RunningAppClone & runningAppClone)521 bool SetRunningAppClone(ani_env *env, ani_object object, const AppExecFwk::RunningAppClone &runningAppClone)
522 {
523     if (env == nullptr) {
524         TAG_LOGE(AAFwkTag::APPMGR, "null env");
525         return false;
526     }
527     ani_status status = env->Object_SetPropertyByName_Double(object, "appCloneIndex", runningAppClone.appCloneIndex);
528     if (status != ANI_OK) {
529         TAG_LOGE(AAFwkTag::APPMGR, "appCloneIndex failed status:%{public}d", status);
530         return false;
531     }
532     status = env->Object_SetPropertyByName_Double(object, "uid", runningAppClone.uid);
533     if (status != ANI_OK) {
534         TAG_LOGE(AAFwkTag::APPMGR, "uid failed status:%{public}d", status);
535         return false;
536     }
537     ani_class arrayCls = nullptr;
538     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
539     if (status != ANI_OK) {
540         TAG_LOGE(AAFwkTag::APPMGR, "find class failed status : %{public}d", status);
541         return false;
542     }
543     ani_method arrayCtor;
544     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
545     if (status != ANI_OK) {
546         TAG_LOGE(AAFwkTag::APPMGR, "find ctor failed status : %{public}d", status);
547         return false;
548     }
549     ani_object arrayObj;
550     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, runningAppClone.pids.size());
551     if (status != ANI_OK) {
552         TAG_LOGE(AAFwkTag::APPMGR, "Object_New array failed status : %{public}d", status);
553         return false;
554     }
555     ani_size index = 0;
556     for (auto &pid : runningAppClone.pids) {
557         status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ID;:V", index, pid);
558         if (status != ANI_OK) {
559             TAG_LOGE(AAFwkTag::APPMGR, "set failed status : %{public}d", status);
560             return false;
561         }
562         index++;
563     }
564     status = env->Object_SetPropertyByName_Ref(object, "pids", arrayObj);
565     if (status != ANI_OK) {
566         TAG_LOGE(AAFwkTag::APPMGR, "pids failed status:%{public}d", status);
567         return false;
568     }
569     return true;
570 }
571 
WrapProcessData(ani_env * env,const AppExecFwk::ProcessData & processData)572 ani_object WrapProcessData(ani_env *env, const AppExecFwk::ProcessData &processData)
573 {
574     ani_class cls = nullptr;
575     ani_status status = ANI_ERROR;
576     ani_method method = nullptr;
577     ani_object object = nullptr;
578     if (env == nullptr) {
579         TAG_LOGE(AAFwkTag::APPMGR, "null env");
580         return nullptr;
581     }
582     if ((status = env->FindClass(PROCESS_DATA_CLASS_NAME, &cls)) != ANI_OK) {
583         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
584         return nullptr;
585     }
586     if (cls == nullptr) {
587         TAG_LOGE(AAFwkTag::APPMGR, "null cls");
588         return nullptr;
589     }
590     if ((status = env->Class_FindMethod(cls, "<ctor>", ":V", &method)) != ANI_OK) {
591         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
592         return nullptr;
593     }
594     if ((status = env->Object_New(cls, method, &object)) != ANI_OK) {
595         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
596         return nullptr;
597     }
598     if (object == nullptr) {
599         TAG_LOGE(AAFwkTag::APPMGR, "null object");
600         return nullptr;
601     }
602     if (!SetProcessData(env, object, processData)) {
603         TAG_LOGE(AAFwkTag::APPMGR, "SetProcessData failed");
604         return nullptr;
605     }
606     return object;
607 }
608 
SetProcessData(ani_env * env,ani_object object,const AppExecFwk::ProcessData & processData)609 bool SetProcessData(ani_env *env, ani_object object, const AppExecFwk::ProcessData &processData)
610 {
611     if (env == nullptr) {
612         TAG_LOGE(AAFwkTag::APPMGR, "null env");
613         return false;
614     }
615     ani_status status = env->Object_SetFieldByName_Ref(
616         object, "bundleName", OHOS::AppExecFwk::GetAniString(env, processData.bundleName));
617     if (status != ANI_OK) {
618         TAG_LOGE(AAFwkTag::APPMGR, "bundleName failed status:%{public}d", status);
619         return false;
620     }
621     status = env->Object_SetFieldByName_Double(object, "pid", processData.pid);
622     if (status != ANI_OK) {
623         TAG_LOGE(AAFwkTag::APPMGR, "pid failed status:%{public}d", status);
624         return false;
625     }
626     status = env->Object_SetFieldByName_Double(object, "uid", processData.uid);
627     if (status != ANI_OK) {
628         TAG_LOGE(AAFwkTag::APPMGR, "uid failed status:%{public}d", status);
629         return false;
630     }
631     status = env->Object_SetFieldByName_Double(object, "state", static_cast<double>(processData.state));
632     if (status != ANI_OK) {
633         TAG_LOGE(AAFwkTag::APPMGR, "state failed status:%{public}d", status);
634         return false;
635     }
636     status = env->Object_SetFieldByName_Boolean(object, "isContinuousTask", processData.isContinuousTask);
637     if (status != ANI_OK) {
638         TAG_LOGE(AAFwkTag::APPMGR, "isContinuousTask failed status:%{public}d", status);
639         return false;
640     }
641     status = env->Object_SetFieldByName_Boolean(object, "isKeepAlive", processData.isKeepAlive);
642     if (status != ANI_OK) {
643         TAG_LOGE(AAFwkTag::APPMGR, "isKeepAlive failed status:%{public}d", status);
644         return false;
645     }
646     return true;
647 }
648 
UnWrapArrayString(ani_env * env,ani_object arrayObj,std::vector<std::string> & stringList)649 bool UnWrapArrayString(ani_env *env, ani_object arrayObj, std::vector<std::string> &stringList)
650 {
651     if (env == nullptr || arrayObj == nullptr) {
652         TAG_LOGE(AAFwkTag::APPMGR, "env null or arrayObj null");
653         return false;
654     }
655     stringList.clear();
656     ani_size size = 0;
657     ani_status status = ANI_ERROR;
658     if ((status = env->Array_GetLength(reinterpret_cast<ani_array>(arrayObj), &size)) != ANI_OK) {
659         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
660         return false;
661     }
662     ani_ref ref = nullptr;
663     ani_size idx = 0;
664     for (idx = 0; idx < size; idx++) {
665         if ((status = env->Array_Get_Ref(reinterpret_cast<ani_array_ref>(arrayObj), idx, &ref)) != ANI_OK) {
666             TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d, index: %{public}zu", status, idx);
667             return false;
668         }
669         std::string str = "";
670         if (!OHOS::AppExecFwk::GetStdString(env, reinterpret_cast<ani_string>(ref), str)) {
671             TAG_LOGE(AAFwkTag::JSNAPI, "GetStdString failed, index: %{public}zu", idx);
672             return false;
673         }
674         stringList.push_back(str);
675     }
676     return true;
677 }
678 
CreateDoubleAniArray(ani_env * env,const std::vector<int32_t> & dataArry)679 ani_object CreateDoubleAniArray(ani_env * env, const std::vector<int32_t> &dataArry)
680 {
681     ani_class arrayCls = nullptr;
682     ani_status status = ANI_OK;
683 
684     if (env == nullptr) {
685         TAG_LOGE(AAFwkTag::APPMGR, "null env");
686         return nullptr;
687     }
688 
689     status = env->FindClass(CLASSNAME_ARRAY, &arrayCls);
690     if (status != ANI_OK) {
691         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
692         return nullptr;
693     }
694 
695     ani_method arrayCtor = nullptr;
696     status = env->Class_FindMethod(arrayCls, "<ctor>", "I:V", &arrayCtor);
697     if (status != ANI_OK) {
698         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
699         return nullptr;
700     }
701 
702     ani_object arrayObj = nullptr;
703     status = env->Object_New(arrayCls, arrayCtor, &arrayObj, dataArry.size());
704     if (status != ANI_OK) {
705         TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
706         return arrayObj;
707     }
708 
709     for (size_t i = 0; i < dataArry.size(); i++) {
710         ani_object intObj = AppExecFwk::CreateDouble(env, static_cast<double>(dataArry[i]));
711         if (intObj == nullptr) {
712             TAG_LOGE(AAFwkTag::APPMGR, "intObj nullptr");
713             return nullptr;
714         }
715         ani_status status = env->Object_CallMethodByName_Void(arrayObj, "$_set", "ILstd/core/Object;:V", i, intObj);
716         if (status != ANI_OK) {
717             TAG_LOGE(AAFwkTag::APPMGR, "status : %{public}d", status);
718             return nullptr;
719         }
720     }
721     return arrayObj;
722 }
723 } // namespace AppManagerEts
724 } // namespace OHOS
725