2014-09-12 2 views
2

Как написать пользовательскую прокладку Emscripten для библиотеки C? Emscripten связывает прокладки для определенных библиотек C, таких как SDL и OpenAL, но для других библиотек вам придется сворачивать свои собственные.Как написать прокладку Emscripten для библиотеки C

С помощью прокладки я имею в виду замену JavaScript для библиотеки C, от которой зависит перенос кода.

ответ

4

Emscripten имеет некоторые documentation on the subject, хотя на момент написания статьи он несколько неполный.

Прежде всего, вам нужно написать "библиотеку" Emscripten в JavaScript, давайте предположим, соответствующую библиотеку C называется Пример:

example.js:

// "use strict"; 

var LibraryExample = { 
    // Internal functions 
    $EXAMPLE: { 
     internal_func: function() { 
     } 
    }, 
    example_initialize: function (arg) { 
     EXAMPLE.internal_func() 
    } 
} 

autoAddDeps(LibraryExample, '$EXAMPLE') 
mergeInto(LibraryManager.library, LibraryExample) 

Во-вторых, вам должны интегрировать свои example.js файл в сборку, через EMCC в --js библиотека вариант:

emcc --js-library shims/example.js -o project.js project.bc 

Теперь функция example_initialize должна быть доступна JS-коду, сгенерированному Emscripten, таким образом заменяя зависимость библиотеки C.

0

Если вы хотите написать библиотеку JavaScript в TypeScript, вы можете использовать npm package emscripten-library-decorator. Затем вы можете написать библиотеку как класс со статическими функциями и экспортировать их в код asm.js, добавив в класс декоратора @exportLibrary.

Функции, зависящие от других, нуждаются в декораторе @dep с другими необходимыми функциями в качестве параметров, поскольку в противном случае они, вероятно, будут удалены с помощью устранения мертвого кода Emscripten, если они также не вызываются непосредственно со стороны C или C++.

Вот пример из НПМ пакета README:

/// <reference path="node_modules/emscripten-library-decorator/index.ts" /> 

function _print(message: string) { 
    console.log(message); 
} 

@exportLibrary 
class test { 
    @dep(_print) 
    static hello() { 
     _print('Hello, World!!'); 
    } 

    static foobar = 42; 
}; 

Там также longer article with more information.

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