2014-08-29 1 views
4

С помощью Emscripten можно ли вызывать указатель на функцию (таким образом, число) из JavaScript?
Подпись функции является переменной, поэтому я не могу написать помощника и сделать это.Вызов указателя функции с Emscripten

Чтобы проиллюстрировать пример, у меня есть функция, как это:

// Returns a function pointer to call, with the appropiate 
// arguments, to initialize the demanded feature. 
void* get_feature_activator(feature_t feat); 

Вы должны использовать его следующим образом:

// Initialize the speaker 
void* activator = get_feature_activator(FEATURE_SPEAKER); 
// We know this function needs one float, so we cast and call it 
((void(*)(float))activator) (3.0); 

Чтобы сделать то же самое с JavaScript:

var activator = _get_feature_activator(constants.FEATURE_SPEAKER); 
// TODO: Need to call this pointer with one float 

ответ

6

Вы можете вызвать указатель функции C из JS, используя Runtime.dynCall. Смотрите, например

https://github.com/kripken/emscripten/blob/ee17f05c0a45cad728ce0f215f2d2ffcdd75434b/src/library_browser.js#L715

Аргументы (type signature, pointer, array of arguments). Например, тип «vi» означает return void, получает один целочисленный параметр. Это соответствует FUNCTION_TABLE_vi, который вы можете видеть в сгенерированном коде.

+2

Whoa! Я видел эти функции раньше, и я знал, что вы можете использовать их для вызова указателя, но ... Я думал, что это римские цифры xD –

0

Я хотел бы создать функцию C:

void call_feature_activator(int activator, float in_val) { 
    ((void(*)(float))activator) (in_val); 
} 

Затем вы можете вызвать функцию со стороны JavaScript, чтобы вызвать ваш вызов активатора, и он обработает возврат к указателю функции и вызову его.

+0

Как я уже сказал, я не могу использовать помощника, потому что подпись не фиксирована. В этом случае функция принимает один float, но для другой функции он может принимать два int и т. Д. –

+0

Есть ли способ вызвать указатель функции, не создавая функцию C для каждой возможной подписи? –

 Смежные вопросы

  • Нет связанных вопросов^_^