1# Working with Latin1/UTF16 Strings Using JSVM-API 2 3## Introduction 4 5This topic walks you through on how to create and use external strings using JSVM-API. 6 7## Basic Concepts 8 9By using JSVM-API, you can create JS strings directly in the memory allocated for Latin1/UTF16 strings. This allows you to manipulate these strings like normal JS strings. 10 11## Available APIs 12 13| API | Description | 14|----------------------------------------|--------------------------------| 15| OH_JSVM_CreateExternalStringLatin1 | Creates an external JS string from a C string encoded in ISO-8859-1 format. | 16| OH_JSVM_CreateExternalStringUtf16 | Creates an external JS string from a C string encoded in UTF16-LE format. | 17 18## Example 19 20If you are just starting out with JSVM-API, see [JSVM-API Development Process](use-jsvm-process.md). The following demonstrates only the C++ code involved in manipulating external strings. 21 22### Determining a Number Object 23 24CPP code: 25 26```cpp 27#include <cstring> 28#include <string> 29static char stringLatin1[] = "hello"; 30static char16_t stringUTF16[] = u"world"; 31 32static JSVM_Value testExternalString(JSVM_Env env, JSVM_CallbackInfo info) { 33 JSVM_VM vm; 34 OH_JSVM_GetVM(env, &vm); 35 36 JSVM_HandleScope handleScope; 37 OH_JSVM_OpenHandleScope(env, &handleScope); 38 JSVM_Value jsStrLatin1 = nullptr; 39 bool copied = true; 40 char buf[10]; 41 OH_JSVM_CreateExternalStringLatin1(env, stringLatin1, strlen(stringLatin1), nullptr, nullptr, 42 &jsStrLatin1, &copied); 43 OH_JSVM_GetValueStringUtf8(env, jsStrLatin1, buf, 10, nullptr); 44 OH_LOG_INFO(LOG_APP, "created latin1 string is : %{public}s\n", buf); 45 // If the value of copied is true, the external string fails to be created. Otherwise, the external string is created successfully. 46 OH_LOG_INFO(LOG_APP, "create external string failed : %{public}d\n", copied); 47 copied = true; 48 JSVM_Value jsStrUTF16 = nullptr; 49 OH_JSVM_CreateExternalStringUtf16(env, stringUTF16, std::char_traits<char16_t>::length(stringUTF16), 50 nullptr, nullptr, &jsStrUTF16, &copied); 51 OH_JSVM_GetValueStringUtf8(env, jsStrUTF16, buf, 10, nullptr); 52 OH_LOG_INFO(LOG_APP, "created utf16 string is : %{public}s\n", buf); 53 // If the value of copied is true, the external string fails to be created. Otherwise, the external string is created successfully. 54 OH_LOG_INFO(LOG_APP, "create external string failed : %{public}d\n", copied); 55 OH_JSVM_CloseHandleScope(env, handleScope); 56 57 return nullptr; 58} 59 60static JSVM_CallbackStruct param[] = { 61 {.data = nullptr, .callback = testExternalString}, 62}; 63 64static JSVM_CallbackStruct *method = param; 65 66// Alias for the wrapperObject method to be called from JS. 67static JSVM_PropertyDescriptor descriptor[] = { 68 {"testExternalString", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 69}; 70 71// Call the C++ code from JS. 72const char *srcCallNative = R"JS(testExternalString();)JS"; 73 74``` 75 76## Expected Result 77``` 78created latin1 string is : hello 79create external string failed: 0 80created utf16 string is : world 81create external string failed: 0 82``` 83