mirror of
https://gitee.com/openharmony/napi_generator
synced 2025-02-16 23:30:29 +00:00
!474 napi接口修改:napi_wrap
Merge pull request !474 from zhangmenghan/master
This commit is contained in:
commit
db6e3e91ab
@ -64,7 +64,7 @@ napi_value SayHello(napi_env env, napi_callback_info info);
|
|||||||
napi_value testNapiCreateFunction(napi_env env, napi_callback_info info);
|
napi_value testNapiCreateFunction(napi_env env, napi_callback_info info);
|
||||||
|
|
||||||
napi_value jsObjectWrapInit(napi_env env, napi_value exports);
|
napi_value jsObjectWrapInit(napi_env env, napi_value exports);
|
||||||
napi_value testNapiWrap(napi_env env, napi_callback_info info);
|
|
||||||
napi_value testNapiUnwrap(napi_env env, napi_callback_info info);
|
napi_value testNapiUnwrap(napi_env env, napi_callback_info info);
|
||||||
|
napi_value WrapInit(napi_env env, napi_value exports);
|
||||||
|
|
||||||
#endif //NAPITUTORIALS_JAVASCRIPTAPI_H
|
#endif //NAPITUTORIALS_JAVASCRIPTAPI_H
|
||||||
|
@ -119,7 +119,10 @@ static napi_value Init(napi_env env, napi_value exports)
|
|||||||
|
|
||||||
// 对应 javascriptapi/jsobjectwrap/jsObjectWrapInit.cpp
|
// 对应 javascriptapi/jsobjectwrap/jsObjectWrapInit.cpp
|
||||||
jsObjectWrapInit(env, exports);
|
jsObjectWrapInit(env, exports);
|
||||||
|
|
||||||
|
// 对应 javascriptapi/jsobjectwrap/napiwrap.cpp
|
||||||
|
WrapInit(env, exports);
|
||||||
|
|
||||||
napi_property_descriptor descArr[] = {
|
napi_property_descriptor descArr[] = {
|
||||||
{"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr},
|
{"add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr},
|
||||||
{"getTestCase", nullptr, getTestCase, nullptr, nullptr, nullptr, napi_default, nullptr},
|
{"getTestCase", nullptr, getTestCase, nullptr, nullptr, nullptr, napi_default, nullptr},
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
napi_value jsObjectWrapInit(napi_env env, napi_value exports)
|
napi_value jsObjectWrapInit(napi_env env, napi_value exports)
|
||||||
{
|
{
|
||||||
napi_property_descriptor desc[] = {
|
napi_property_descriptor desc[] = {
|
||||||
{"testNapiWrap", nullptr, testNapiWrap, nullptr, nullptr, nullptr, napi_default, nullptr},
|
|
||||||
{"testNapiUnwrap", nullptr, testNapiUnwrap, nullptr, nullptr, nullptr, napi_default, nullptr}};
|
{"testNapiUnwrap", nullptr, testNapiUnwrap, nullptr, nullptr, nullptr, napi_default, nullptr}};
|
||||||
|
|
||||||
napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc);
|
napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc);
|
||||||
|
@ -17,58 +17,110 @@
|
|||||||
#include "javascriptapi.h"
|
#include "javascriptapi.h"
|
||||||
|
|
||||||
static const char *TAG = "[javascriptapi_object_wrap]";
|
static const char *TAG = "[javascriptapi_object_wrap]";
|
||||||
static const int MAX_BUFFER_SIZE = 128;
|
|
||||||
|
|
||||||
class Node {
|
class testNapiWrap {
|
||||||
public:
|
public:
|
||||||
Node(napi_env env, napi_value id)
|
static napi_value Init(napi_env env, napi_value exports);
|
||||||
{
|
static void Destructor(napi_env env, void *nativeObject, void *finalizeHint);
|
||||||
// 将 JavaScript 字符串转换为 C++ 字符串
|
|
||||||
size_t idLength = MAX_BUFFER_SIZE;
|
|
||||||
char buf[MAX_BUFFER_SIZE];
|
|
||||||
char *buffer = buf;
|
|
||||||
napi_get_value_string_utf8(env, id, buffer, idLength, nullptr);
|
|
||||||
// 将 C++ 字符串转换为 std::string
|
|
||||||
_id = std::string(buffer);
|
|
||||||
}
|
|
||||||
std::string GetId() { return _id; }
|
|
||||||
private:
|
private:
|
||||||
std::string _id; // 成员变量,存储 id
|
explicit testNapiWrap(napi_value value_ = 0);
|
||||||
|
~testNapiWrap();
|
||||||
|
|
||||||
|
static napi_value New(napi_env env, napi_callback_info info);
|
||||||
|
static napi_value Tyof(napi_env env, napi_callback_info info);
|
||||||
|
|
||||||
|
napi_value value_;
|
||||||
|
napi_env env_;
|
||||||
|
napi_ref wrapper_;
|
||||||
};
|
};
|
||||||
|
|
||||||
napi_value testNapiWrap(napi_env env, napi_callback_info info)
|
static thread_local napi_ref g_ref = nullptr;
|
||||||
|
|
||||||
|
testNapiWrap::testNapiWrap(napi_value value) : value_(value), env_(nullptr), wrapper_(nullptr) {}
|
||||||
|
|
||||||
|
testNapiWrap::~testNapiWrap() { napi_delete_reference(env_, wrapper_); }
|
||||||
|
|
||||||
|
void testNapiWrap::Destructor(napi_env env, void *nativeObject, [[maybe_unused]] void *finalizeHint)
|
||||||
{
|
{
|
||||||
size_t argc = PARAM1;
|
reinterpret_cast<testNapiWrap *>(nativeObject)->~testNapiWrap();
|
||||||
napi_value argv[PARAM1] = {0};
|
}
|
||||||
napi_value thisObj = nullptr;
|
|
||||||
void *data = nullptr;
|
napi_value testNapiWrap::Tyof(napi_env env, napi_callback_info info)
|
||||||
napi_status status;
|
{
|
||||||
napi_value cons;
|
napi_value jsThis;
|
||||||
const napi_extended_error_info *extended_error_info;
|
napi_valuetype result;
|
||||||
// 获取回调函数的参数信息
|
napi_value resultStr;
|
||||||
status = napi_get_cb_info(env, info, &argc, argv, &thisObj, &data);
|
napi_status status;
|
||||||
if (status != napi_ok) {
|
size_t argc = PARAM1;
|
||||||
getErrMsg(status, env, extended_error_info, "Failed to get callback info", TAG);
|
napi_value argv[PARAM1];
|
||||||
return NULL;
|
const napi_extended_error_info *extended_error_info;
|
||||||
}
|
status = napi_get_cb_info(env, info, &argc, argv, &jsThis, nullptr);
|
||||||
napi_valuetype resultType;
|
if (status != napi_ok) {
|
||||||
napi_typeof(env, argv[PARAM0], &resultType);
|
getErrMsg(status, env, extended_error_info, "get cb info", TAG);
|
||||||
if (resultType != napi_string) {
|
return NULL;
|
||||||
std::string res = "Expected a string, got " + std::to_string(resultType);
|
}
|
||||||
napi_throw_error(env, NULL, res.c_str());
|
testNapiWrap *obj;
|
||||||
return NULL;
|
status = napi_unwrap(env, jsThis, reinterpret_cast<void **>(&obj));
|
||||||
}
|
if (status != napi_ok || obj == nullptr) {
|
||||||
auto instance = new Node(env, argv[PARAM0]);
|
getErrMsg(status, env, extended_error_info, "call napi_typeof()", TAG);
|
||||||
status = napi_wrap(env, thisObj, instance,
|
return NULL;
|
||||||
[](napi_env environment, void *data, void *hint) {
|
}
|
||||||
auto objInfo = reinterpret_cast<Node *>(data);
|
status = napi_typeof(env, argv[0], &result);
|
||||||
if (objInfo != nullptr) {
|
if (status != napi_ok) {
|
||||||
delete objInfo;
|
getErrMsg(status, env, extended_error_info, "call napi_typeof()", TAG);
|
||||||
}
|
return NULL;
|
||||||
}, NULL, NULL);
|
}
|
||||||
if (status != napi_ok) {
|
status = napiValueType2Str(env, result, &resultStr);
|
||||||
getErrMsg(status, env, extended_error_info, "wrap", TAG);
|
if (status != napi_ok) {
|
||||||
return NULL;
|
std::string errMsg = "Failed to convert napi_valuetype " + std::to_string(status) + " to string";
|
||||||
}
|
napi_throw_error(env, NULL, errMsg.c_str());
|
||||||
return thisObj;
|
return NULL;
|
||||||
|
}
|
||||||
|
return resultStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
napi_value testNapiWrap::New(napi_env env, napi_callback_info info)
|
||||||
|
{
|
||||||
|
napi_value newTarget;
|
||||||
|
napi_get_new_target(env, info, &newTarget);
|
||||||
|
if (newTarget != nullptr) {
|
||||||
|
size_t argc = PARAM1;
|
||||||
|
napi_value args[PARAM1];
|
||||||
|
napi_value jsThis;
|
||||||
|
napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
|
||||||
|
napi_value value;
|
||||||
|
testNapiWrap *obj = new testNapiWrap(value);
|
||||||
|
obj->env_ = env;
|
||||||
|
napi_wrap(env, jsThis, reinterpret_cast<void *>(obj), testNapiWrap::Destructor,
|
||||||
|
nullptr, // finalize_hint
|
||||||
|
&obj->wrapper_);
|
||||||
|
return jsThis;
|
||||||
|
} else {
|
||||||
|
size_t argc = PARAM1;
|
||||||
|
napi_value args[PARAM1];
|
||||||
|
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
|
||||||
|
napi_value cons;
|
||||||
|
napi_get_reference_value(env, g_ref, &cons);
|
||||||
|
napi_value instance;
|
||||||
|
napi_new_instance(env, cons, argc, args, &instance);
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
napi_value testNapiWrap::Init(napi_env env, napi_value exports)
|
||||||
|
{
|
||||||
|
napi_property_descriptor properties[] = {{"Tyof", nullptr, Tyof, nullptr, nullptr, nullptr, napi_default, nullptr}};
|
||||||
|
napi_value cons;
|
||||||
|
napi_define_class(env, "testNapiWrap", NAPI_AUTO_LENGTH, New, nullptr, 1, properties, &cons);
|
||||||
|
napi_create_reference(env, cons, 1, &g_ref);
|
||||||
|
napi_set_named_property(env, exports, "testNapiWrap", cons);
|
||||||
|
return exports;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
napi_value WrapInit(napi_env env, napi_value exports)
|
||||||
|
{
|
||||||
|
testNapiWrap::Init(env, exports);
|
||||||
|
return exports;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,11 @@ export interface Callback<T> {
|
|||||||
(data: T): void;
|
(data: T): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class testNapiWrap {
|
||||||
|
constructor();
|
||||||
|
Tyof: (arg: any) => string;
|
||||||
|
}
|
||||||
|
|
||||||
export const add: (a: number, b: number) => number;
|
export const add: (a: number, b: number) => number;
|
||||||
export const getTestCase: (a: number) => tcBase;
|
export const getTestCase: (a: number) => tcBase;
|
||||||
export const testNapiStatus: (a: number, b: number) => number;
|
export const testNapiStatus: (a: number, b: number) => number;
|
||||||
@ -71,5 +76,4 @@ export const testNapiCallFunction: (a: Function, b: number) => number;
|
|||||||
export const testNapiCreateFunction: () => any;
|
export const testNapiCreateFunction: () => any;
|
||||||
|
|
||||||
/* work_with_javascript_objectwrap */
|
/* work_with_javascript_objectwrap */
|
||||||
export const testNapiWrap: (a: string) => any;
|
|
||||||
export const testNapiUnwrap: (a: any) => string;
|
export const testNapiUnwrap: (a: any) => string;
|
@ -16,7 +16,7 @@
|
|||||||
import router from '@ohos.router';
|
import router from '@ohos.router';
|
||||||
import image from '@ohos.multimedia.image';
|
import image from '@ohos.multimedia.image';
|
||||||
import Logger from '../../../util/Logger';
|
import Logger from '../../../util/Logger';
|
||||||
import testNapi, { testNapiValue } from 'libentry.so';
|
import testNapi from 'libentry.so';
|
||||||
import { TitleBar } from '../../../common/TitleBar'
|
import { TitleBar } from '../../../common/TitleBar'
|
||||||
import hilog from '@ohos.hilog';
|
import hilog from '@ohos.hilog';
|
||||||
|
|
||||||
@ -33,6 +33,8 @@ struct napiwrap {
|
|||||||
@State testcont: string = ' // 测试 N-API napi_wrap \n'
|
@State testcont: string = ' // 测试 N-API napi_wrap \n'
|
||||||
+ ' const result = testNapi.testNapiWrap(); \n'
|
+ ' const result = testNapi.testNapiWrap(); \n'
|
||||||
+ ' console.log(result); \n'
|
+ ' console.log(result); \n'
|
||||||
|
+ ' const ret = result.Tyof(1024); \n'
|
||||||
|
+ ' console.log(ret);\n'
|
||||||
|
|
||||||
|
|
||||||
controller: TextAreaController = new TextAreaController()
|
controller: TextAreaController = new TextAreaController()
|
||||||
@ -83,8 +85,10 @@ struct napiwrap {
|
|||||||
.margin({ left: 24 })
|
.margin({ left: 24 })
|
||||||
.id('napi_wrap')
|
.id('napi_wrap')
|
||||||
.onClick(() => {
|
.onClick(() => {
|
||||||
console.log(`testNapi.testNapiWrap() is ${testNapi.testNapiWrap('tree')}`);
|
let node: testNapi.testNapiWrap = new testNapi.testNapiWrap();
|
||||||
this.testcont = this.testcont.replace('log(result)', 'log(## ' +typeof (testNapi.testNapiWrap('tree')) + ' ##)');
|
let ret = node.Tyof(1024);
|
||||||
|
this.testcont = this.testcont.replace('log(result)', 'log(## type of node is ' + typeof (node) + ' ##)');
|
||||||
|
this.testcont = this.testcont.replace('log(ret)', 'log(## ' + ret + ' ##)');
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
.width('100%')
|
.width('100%')
|
||||||
|
@ -42,11 +42,29 @@ export default function abilityTestJsObjectWrap() {
|
|||||||
it('testNapiWrap', 0, () => {
|
it('testNapiWrap', 0, () => {
|
||||||
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
// Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
|
||||||
hilog.info(0x0000, 'testTag', '%{public}s', 'it testNapiWrap begin');
|
hilog.info(0x0000, 'testTag', '%{public}s', 'it testNapiWrap begin');
|
||||||
hilog.info(0x0000, 'testTag', `type of napi_wrap("7") is = ${typeof (testNapi.testNapiWrap("7"))}`);
|
let ret: testNapi.testNapiWrap = new testNapi.testNapiWrap();
|
||||||
expect(typeof (testNapi.testNapiWrap("7"))).assertEqual('object');
|
hilog.info(0x0000, 'testTag', `type of napi_wrap() is = ${typeof (ret)}`);
|
||||||
|
expect(typeof (ret)).assertEqual('object');
|
||||||
|
|
||||||
hilog.info(0x0000, 'testTag', `type of napi_wrap("tree") is = ${typeof (testNapi.testNapiWrap("tree"))}`);
|
let ret1 = ret.Tyof('');
|
||||||
expect(typeof (testNapi.testNapiWrap("tree"))).assertEqual('object');
|
hilog.info(0x0000, 'testTag', `type of ret.Tyof('') is = ${typeof (ret1)}`);
|
||||||
|
expect(ret1).assertEqual('string');
|
||||||
|
|
||||||
|
let ret2 = ret.Tyof(false);
|
||||||
|
hilog.info(0x0000, 'testTag', `type of ret.Tyof(false) is = ${typeof (ret2)}`);
|
||||||
|
expect(ret2).assertEqual('boolean');
|
||||||
|
|
||||||
|
let ret3 = ret.Tyof(3);
|
||||||
|
hilog.info(0x0000, 'testTag', `type of ret.Tyof(3) is = ${typeof (ret3)}`);
|
||||||
|
expect(ret3).assertEqual('number');
|
||||||
|
|
||||||
|
let ret4 = ret.Tyof(null);
|
||||||
|
hilog.info(0x0000, 'testTag', `type of ret.Tyof(null) is = ${typeof (ret4)}`);
|
||||||
|
expect(ret4).assertEqual('null');
|
||||||
|
|
||||||
|
let ret5 = ret.Tyof(undefined);
|
||||||
|
hilog.info(0x0000, 'testTag', `type of ret.Tyof(3) is = ${typeof (ret5)}`);
|
||||||
|
expect(ret5).assertEqual('undefined');
|
||||||
})
|
})
|
||||||
|
|
||||||
it('testNapiUnwrap', 0, () => {
|
it('testNapiUnwrap', 0, () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user