使用JSVM-API接口提供Latin1/UTF16格式字符串相关开发
===================================

#### 简介

JSVM-API中新增创建和使用外部字符串的接口。

#### 基本概念

在JSVM-API中，在用户提供的Latin1/UTF16格式字符串所在内存上直接创建对应的JavaScript字符串，和正常的JavaScript字符串能够进行同样的操作。

#### 接口说明

| 接口 | 功能说明 |
| :-- | :-- |
| OH\_JSVM\_CreateExternalStringLatin1 | 使用ISO-8859-1编码的C字符串，创建一个外部的JavaScript字符串。 |
| OH\_JSVM\_CreateExternalStringUtf16 | 使用UTF16-LE编码的C字符串，创建一个外部的JavaScript字符串。 |

#### 使用示例

JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-jsvm-process)，本文仅对接口对应C++相关代码进行展示。

#### \[h2\]使用接口判断是否是Number Object

cpp部分代码

#include <cstring>
#include <string>
static char stringLatin1\[\] = "hello";
static char16\_t stringUTF16\[\] = u"world";

static JSVM\_Value testExternalString(JSVM\_Env env, JSVM\_CallbackInfo info) {
    JSVM\_VM vm;
    OH\_JSVM\_GetVM(env, &vm);

    JSVM\_HandleScope handleScope;
    OH\_JSVM\_OpenHandleScope(env, &handleScope);
    JSVM\_Value jsStrLatin1 = nullptr;
    bool copied = true;
    char buf\[10\];
    OH\_JSVM\_CreateExternalStringLatin1(env, stringLatin1, strlen(stringLatin1), nullptr, nullptr,
                                       &jsStrLatin1, &copied);
    OH\_JSVM\_GetValueStringUtf8(env, jsStrLatin1, buf, 10, nullptr);
    OH\_LOG\_INFO(LOG\_APP, "created latin1 string is : %{public}s\\n", buf);
    // 这里 copied 为 true 表示创建 external string 失败，否则表示创建成功
    OH\_LOG\_INFO(LOG\_APP, "create external string failed : %{public}d\\n", copied);
    copied = true;
    JSVM\_Value jsStrUTF16 = nullptr;
    OH\_JSVM\_CreateExternalStringUtf16(env, stringUTF16, std::char\_traits<char16\_t>::length(stringUTF16),
                                      nullptr, nullptr, &jsStrUTF16, &copied);
    OH\_JSVM\_GetValueStringUtf8(env, jsStrUTF16, buf, 10, nullptr);
    OH\_LOG\_INFO(LOG\_APP, "created utf16 string is : %{public}s\\n", buf);
    // 这里 copied 为 true 表示创建 external string 失败，否则表示创建成功
    OH\_LOG\_INFO(LOG\_APP, "create external string failed : %{public}d\\n", copied);
    OH\_JSVM\_CloseHandleScope(env, handleScope);

    return nullptr;
}

static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = testExternalString},
};

static JSVM\_CallbackStruct \*method = param;

// wrapperObject方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"testExternalString", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};

// 样例测试JS
const char \*srcCallNative = R"JS(testExternalString();)JS";

#### 预期输出结果

created latin1 string is : hello
create external string failed: 0
created utf16 string is : world
create external string failed: 0