Я написал плагин NPAPI, используя структуру firebreath. Я могу передавать простые числовые значения из Javascript и получать к ним доступ в моем (C++) плагине, выполнять операции и затем возвращать результат. Я хотел бы знать, как теперь работать с векторами, то есть с массивами. Я не хочу выделять новый массив внутри моего плагина и копировать массив из JavaScript (хотя я понятия не имею, как это сделать). Как я могу получить прямой доступ к массиву JavaScript в моем плагине? Есть ли специальный способ сделать это?
Доступ к массиву Javascript в С++/плагине?
Ответы (1)
Объекты Javascript можно использовать с типом FB::JSObjectPtr. Примеры объектов JavaScript, которые вы можете использовать, включают:
- Объекты Javascript (с методами и/или значениями-членами)
- Массивы Javascript (которые вы планируете изменить; в противном случае вы можете использовать тип контейнера)
- Методы Javascript для обратного вызова
Массивы — это объекты; получить значения с помощью getProperty(n) или getProperty("length") и т.д.
Вы также можете использовать такие методы, как ->invoke("push", FB::variant_list_of(val)) и т.д.
(в методе JSAPI, чтобы использовать тип JSObjectPtr, вы должны использовать метод, который выглядит примерно так:)
void doSomethingWithAnArray(const FB::JSObjectPtr& array) { ... }
Также помните, что FireBreath не может сказать, какой это тип js-объекта, только то, что есть js-объект; вам придется самостоятельно обнаруживать ошибки в случае, когда они дают вам не фактический массив, а какой-то другой объект.
person
taxilian
schedule
09.09.2012
Спасибо большое Таксилиан. Я даже рассматриваю возможность использования js-ctypes (что, по-видимому, намного проще). Я знаю, что js-ctypes специфичен для Mozilla и используется в расширениях. Видите ли вы какую-либо разницу, т.е. чем один лучше другого? У меня нет строгих требований относительно того, должно ли это быть расширением или плагином. Мне просто нужно иметь доступ к родной библиотеке.
- person lucent; 11.09.2012
Как правило, если что-то, кроме плагина, будет работать, делайте это так. Плагины не следует использовать, если нет других жизнеспособных вариантов для вашего приложения. Тем не менее, я никогда не использовал js-ctypes; Я не делаю расширения. Основным недостатком является то, что они привязывают вас к определенному браузеру, если вы не пишете несколько версий.
- person taxilian; 11.09.2012
Привет, таксилиан, я пытаюсь сделать это таким образом в огнедышащем. Но это не работает. Не могли бы вы сообщить мне, что случилось? ` void TestJSAPI::addvect(const FB::JSObjectPtr A, const FB::JSObjectPtr B, FB::JSObjectPtr& C, int N){ int i = 0; for(i = 0; i ‹ N / 2; i++){ std::cout ‹‹ Добавление ‹‹ std::endl; двойная сумма = A->GetProperty(i).cast‹double›() + B->GetProperty(i).cast‹double›(); C-›SetProperty(i,sum); }}`
- person lucent; 12.12.2012
новые вопросы следует задавать как новый вопрос, а не в трудночитаемом комментарии; скорее всего, вам нужно сделать эти константы FB::JSObjectPtr& (со ссылкой) не просто константами. Я не могу прочитать это достаточно хорошо, чтобы догадаться, что еще это может быть
- person taxilian; 12.12.2012
В ПОРЯДКЕ. Извини за это. Я сразу же публикую новый подробный вопрос
- person lucent; 12.12.2012