2012-12-03 9 views
12

Moim celem jest wykorzystanie bibliotek C do utworzenia aplikacji internetowych.javascript rozszerzenie używać C API oparte (bałagan) w webapp

wybrałem drogę, aby to zrobić za pośrednictwem przy użyciu funkcji „łyka”. SWIG narzędzie wymaga trzech rzeczy

1) .c file which defines all the functions. 

2) .i file also called interface file which is creating the 
interface to load the APIs wherin I used the extern keyword. 

3) APP written in javascript extension (.js file). 

Użyłem narzędzia łyk, aby skompilować i uruchomić aplikację do weryfikacji pliku js został wykonany prawidłowo. Aplikacja działa poprawnie w oknie XMING X11.

Na kompilacji tworzy _wrap.o, .o plik i libFILENAME.so

teraz chcę, aby uruchomić tę aplikacjęna stronie przeglądarki.

Do tego użyłem port bałaganu WebKit, który daje nam kod MxLauncher. Używam webkit_iweb_view_load_uri (WEBKIT_IWEB_VIEW (zobacz), "nazwapliku.html"); API, aby załadować mój plik HTML, aby uruchomić ten javascript na moim widoku strony.

jestem łącząc .so utworzony w czasie kompilacji.

Komunikat o błędzie: JS KONSOLA: file: ///filename.js: ReferenceError: Nie można odnaleźć zmienna: przykład

filename.c

int gcd(int x, int y) `enter code here`{ 
    int g; 
    g = y; 
    while (x > 0) { 
    g = x; 
    x = y % x; 
    y = g; 
    } 
    return g; 
} 

filename.i

%module example 
extern int gcd(int x, int y); 

filename.js

x = 42; 
y = 105; 
g = example.gcd(x,y); 

Jak dostać mój cel ma zostać osiągnięty?

Odpowiedz

2

Musisz również poinformować WebKit/JavaScriptCore w czasie wykonywania o swoich powiązaniach (jest to dodatek do pliku filename_wrap.o).

W szczególności należy powiązać je z globalnym obiektem JavaScript (w celu wywołania na przykład .js). Połączenie zwrotne w oknie WebKit może zostać użyte w celu uzyskania aktualnego odniesienia do globalnego kontekstu JavaScript, a następnie można zarejestrować na nim swoje funkcje.

Adaptacja tej example z podpinania do sygnału window-object-cleared kod mógłby wyglądać podobnie do tego:

/* the window callback - 
    fired when the JavaScript window object has been cleared */ 
static void window_object_cleared_cb(WebKitWebView *web_view, 
            WebKitWebFrame *frame, 
            gpointer  context, 
            gpointer  window_object, 
            gpointer  user_data) 
{ 
    /* Add your classes to JavaScriptCore */ 
    example_init(context); // example_init generated by SWIG 
} 


/* ... and in your main application set up */ 
void yourmainfunc() 
{ 
    .... 

    g_signal_connect (G_OBJECT (web_view), "window-object-cleared", 
     G_CALLBACK(window_object_cleared_cb), web_view); 

    webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), "file://filename.html"); 

    ... 
} 

zależności od oddziału SWIG używasz może trzeba generowania funkcji example_init siebie (sprawdź nazwę. cxx); dla odniesienia tutaj jest to, co funkcja inicjująca do register wrapped C functions będzie wyglądać w SWIG:

int example_init(JSContextRef context) { 
    JSObjectRef global = JSContextGetGlobalObject(context); 
... 
    jsc_registerFunction(context, global, "gcd", _wrap_gcd); 
... 
} 

UWAGA - SWIG nie ma jeszcze oficjalnie obsługuje JavaScript; powyższe odnosi się do korzystania z oddziałów SWIG w toku prac (nieprodukcyjnych).

Referencje: