1### 交叉编译结果应用到 HAP 2 31. 使用 DevEco 创建 native C++ 工程项目; 42. 拷贝编译结果到 libs,cJSON 里的 armeabi-v7a(32 位),arm64-v8a(64 位),将里面的 so 库拷贝到工程路径下(\entry\libs) 5 6 ```bash 7 cjsontes\entry\libs> tree 8 ├─arm64-v8a 9 │ ├─libcjson.so 10 │ ├─libcjson.so.1 11 │ └─libcjson.so.1.7.15 12 └─armeabi-v7a 13 ├─libcjson.so 14 ├─libcjson.so.1 15 └─libcjson.so.1.7.15 16 ``` 17 18 19 203. 拷贝对应的头文件到 cpp/thirdparty 目录下 21 22 ```bash 23 cjsontes\entry\src\main\cpp\thirdparty> tree 24 ├─arm64-v8a 25 │ ├─include 26 │ ├─cjson 27 └─armeabi-v7a 28 │ ├─include 29 │ ├─cjson 30 ``` 31 32 33 344. 修改改 CMakeLists.txt 35 36 ```cmake 37 # the minimum version of CMake. 38 39 cmake_minimum_required(VERSION 3.4.1) 40 project(cjsontes) 41 42 set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) 43 set(CJSON_LIB_PATH ${NATIVERENDER_ROOT_PATH}/../../../libs/${OHOS_ARCH}) 44 45 include_directories(${NATIVERENDER_ROOT_PATH} 46 ${NATIVERENDER_ROOT_PATH}/include 47 ${NATIVERENDER_ROOT_PATH}/thirdparty/cJSON/${OHOS_ARCH}/include) 48 49 add_library(entry SHARED hello.cpp) 50 target_link_libraries(entry PUBLIC 51 libace_napi.z.so 52 libace_nd&k.z.so 53 librawfile.z.so 54 libhilog_nd&k.z.so 55 ${CJSON_LIB_PATH}/libcjson.so) 56 ``` 57 58 59 605. 改 build-profile.json5 文件 61 62 ``` 63 { 64 "apiType": "stageMode", 65 "buildOption": { 66 "externalNativeOptions": { 67 "path": "./src/main/cpp/CMakeLists.txt", 68 "arguments": "", 69 "cppFlags": "", 70 # 增加适配的平台 71 "abiFilters": [ 72 "arm64-v8a" 73 ] 74 } 75 }, 76 "targets": [ 77 { 78 "name": "default", 79 "runtimeOS": "Harm&onyOS" 80 }, 81 { 82 "name": "ohosTest", 83 } 84 ] 85 } 86 ``` 87 88 89 906. 修改 hello.cpp:在默认的cpp文件里增加cjson的应用 91 92 ```c++ 93 #include "napi/native_api.h" 94 #include "hilog/log.h" 95 #include "cjson/cJSON.h" 96 97 #define GLOBAL_RESMGR (0xFFEE) 98 99 static const char *TAG = "[cjsontest]"; 100 101 static napi_value Add(napi_env env, napi_callback_info info) 102 { 103 size_t requireArgc = 2; 104 size_t argc = 2; 105 napi_value args[2] = {nullptr}; 106 107 napi_get_cb_info(env, info, &argc, args , nullptr, nullptr); 108 109 napi_valuetype valuetype0; 110 napi_typeof(env, args[0], &valuetype0); 111 112 napi_valuetype valuetype1; 113 napi_typeof(env, args[1], &valuetype1); 114 115 double value0; 116 napi_get_value_double(env, args[0], &value0); 117 118 double value1; 119 napi_get_value_double(env, args[1], &value1); 120 121 // 增加cjson测试代码 122 cJSON *parsed = NULL; 123 char *content = "[\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]"; 124 OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "content %{public}s.", content); 125 126 parsed = cJSON_Parse(content); 127 128 char *jsonmsg = cJSON_Print(parsed); 129 OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "jsonprint %{public}s.", jsonmsg); 130 131 napi_value sum; 132 napi_create_double(env, value0 + value1, &sum); 133 134 return sum; 135 136 } 137 138 EXTERN_C_START 139 static napi_value Init(napi_env env, napi_value exports) 140 { 141 napi_property_descriptor desc[] = { 142 { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr } 143 }; 144 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); 145 return exports; 146 } 147 EXTERN_C_END 148 149 static napi_module demoModule = { 150 .nm_version = 1, 151 .nm_flags = 0, 152 .nm_filename = nullptr, 153 .nm_register_func = Init, 154 .nm_modname = "entry", 155 .nm_priv = ((void*)0), 156 .reserved = { 0 }, 157 }; 158 159 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) 160 { 161 napi_module_register(&demoModule); 162 } 163 ``` 164 165 166 1677. 测试输出 168 169 ```shell 170 com.example.cjsontest E content ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]. 171 com.example.cjsontest E jsonprint ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]. 172 ``` 173 174 175 176