Доступ к массиву Javascript в С++/плагине?

Я написал плагин NPAPI, используя структуру firebreath. Я могу передавать простые числовые значения из Javascript и получать к ним доступ в моем (C++) плагине, выполнять операции и затем возвращать результат. Я хотел бы знать, как теперь работать с векторами, то есть с массивами. Я не хочу выделять новый массив внутри моего плагина и копировать массив из JavaScript (хотя я понятия не имею, как это сделать). Как я могу получить прямой доступ к массиву JavaScript в моем плагине? Есть ли специальный способ сделать это?


person lucent    schedule 09.09.2012    source источник


Ответы (1)


С веб-сайта Firebreath:

Объекты Javascript можно использовать с типом FB::JSObjectPtr. Примеры объектов JavaScript, которые вы можете использовать, включают:

  1. Объекты Javascript (с методами и/или значениями-членами)
  2. Массивы Javascript (которые вы планируете изменить; в противном случае вы можете использовать тип контейнера)
  3. Методы 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
comment
Спасибо большое Таксилиан. Я даже рассматриваю возможность использования js-ctypes (что, по-видимому, намного проще). Я знаю, что js-ctypes специфичен для Mozilla и используется в расширениях. Видите ли вы какую-либо разницу, т.е. чем один лучше другого? У меня нет строгих требований относительно того, должно ли это быть расширением или плагином. Мне просто нужно иметь доступ к родной библиотеке. - person lucent; 11.09.2012
comment
Как правило, если что-то, кроме плагина, будет работать, делайте это так. Плагины не следует использовать, если нет других жизнеспособных вариантов для вашего приложения. Тем не менее, я никогда не использовал js-ctypes; Я не делаю расширения. Основным недостатком является то, что они привязывают вас к определенному браузеру, если вы не пишете несколько версий. - person taxilian; 11.09.2012
comment
Привет, таксилиан, я пытаюсь сделать это таким образом в огнедышащем. Но это не работает. Не могли бы вы сообщить мне, что случилось? ` 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
comment
новые вопросы следует задавать как новый вопрос, а не в трудночитаемом комментарии; скорее всего, вам нужно сделать эти константы FB::JSObjectPtr& (со ссылкой) не просто константами. Я не могу прочитать это достаточно хорошо, чтобы догадаться, что еще это может быть - person taxilian; 12.12.2012
comment
В ПОРЯДКЕ. Извини за это. Я сразу же публикую новый подробный вопрос - person lucent; 12.12.2012