JS/NPAP之间传递数组:NPVARIANT_TO_OBJECT/OBJECT_TO_NPVARIANT

简介: JS/NPAP之间传递数组:NPVARIANT_TO_OBJECT/OBJECT_TO_NPVARIANT

从NPAPI中返回数组,代码要这样写。已经过本人测试:

// 这个写法看起来怪异,可是必须这样写!
// Get window object.
NPObject* pWindow = NULL;
NPN_GetValue(mNpp, NPNVWindowNPObject, &pWindow);
//Get NPVariant
char buf[16]="Array()";
NPString str;
str.UTF8Characters = buf;
str.UTF8Length = strlen(buf);
NPVariant arrayVar;
NPN_Evaluate(mNpp, pWindow, &str, &arrayVar);
//或者使用for循环处理。
//如果使用malloc,记得释放内存。
NPVariant values[2];
INT32_TO_NPVARIANT(123, values[0]);
NPN_SetProperty(mNpp, arrayVar.value.objectValue, NPN_GetIntIdentifier(0), &(values[0]));
INT32_TO_NPVARIANT(456, values[1]);
NPN_SetProperty(mNpp, arrayVar.value.objectValue, NPN_GetIntIdentifier(1), &(values[1]));
OBJECT_TO_NPVARIANT(arrayVar.value.objectValue, *result);

这是另外一段代码。经过测试返回时会出错。

std::vector<NPVariant> vect;//容器
for (int i = 0; i < 2000; i++) {
      NPObject* _stream = nullptr;
      NPObject::CreateInstanceWithRef(m_npp, &_stream);//创建对象
      NPVariant var;
      OBJECT_TO_NPVARIANT(_stream, var);
       BrowserFuncs->retainobject(var.value.objectValue); // will be release by "NPVecClear()"
       vect.push_back(var);
       NPObject::ReleaseInstance(&_stream);//
}
NPObject* arrayObj = NULL;
Utils::CreateJsArray(m_npp, vect, &arrayObj);//通过设置属性的方式
OBJECT_TO_NPVARIANT(arrayObj, *result);//输出给js
Utils::NPVecClear(vect);

以下两段代码是分解从JS得到的数组。没有测试。

NPObject *inObject = val->value.objectValue;
NPVariant npvLength;
NPN_GetProperty(npp, inObject, NPN_GetStringIdentifier("length"), &npvLength);
and then you just do a for loop to get all the values:
for (uint32_t i = 0; i < npvLength.value.intValue; i++) {
    NPVariant curValue;
    NPN_GetProperty(npp, inObject, NPN_GetIntIdentifier(i), &curValue);
    // Do something with curValue
}

代码:

输入数组
NPObject *inObject = args->value.objectValue;
NPVariant npvLength;
NPN_GetProperty(mNpp, inObject, NPN_GetStringIdentifier("length"), &npvLength);
for (uint32_t i = 0; i < npvLength.value.intValue; i++) {
    NPVariant curValue;
    NPN_GetProperty(mNpp, inObject, NPN_GetIntIdentifier(i), &curValue);
    // Do something with curValue
}
目录
相关文章
|
9月前
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
数据采集 JavaScript 前端开发
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
自然语言处理 前端开发 JavaScript
🛠️ JavaScript数组操作指南:20个精通必备技巧🚀
本文详细介绍了 JavaScript 中的 20 个高效数组操作技巧,涵盖了从基本的添加、移除元素,到数组转换和去重等高级操作。强调了不可变性的重要性,提供了清晰的代码示例,帮助开发者编写更整洁和高效的代码。无论是新手还是经验丰富的开发者,这些技巧都将显著提升您的编码能力,使您在项目中更具竞争力。
232 2
|
JavaScript 前端开发 测试技术
JS都有哪些操作数组的方法
JS都有哪些操作数组的方法
423 3
|
JavaScript
js删除数组中已知下标的元素
js删除数组中已知下标的元素
375 4
|
缓存 JavaScript 前端开发
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
JavaScript中数组、对象等循环遍历的常用方法介绍(二)
185 1
|
JavaScript 前端开发 大数据
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
211 0
|
JavaScript 前端开发 API
JS中数组的方法flat()怎么用
JS中数组的方法flat()怎么用
209 0
|
JavaScript 前端开发 索引
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
JavaScript中数组、对象等循环遍历的常用方法介绍(一)
196 0