從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
}