2012-12-03 25 views
12

Mục tiêu của tôi là sử dụng thư viện C để tạo ứng dụng web.javascript để sử dụng API dựa trên C (lộn xộn) trong webapp

Tôi đã chọn cách thực hiện điều đó bằng cách sử dụng công cụ "SWIG". Các Uống một lân công cụ đòi hỏi ba điều

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). 

tôi sử dụng công cụ SWIG để biên dịch và chạy ứng dụng này để xác minh các tập tin .js đã làm một cách chính xác. Ứng dụng đang chạy tốt trên cửa sổ XMING X11.

On biên soạn nó tạo ra _wrap.o, .o tập tin và libFILENAME.so

Bây giờ tôi muốn chạy này ứng dụng trên trang trình duyệt.

Đối với điều này, tôi đã sử dụng cổng lộn xộn webkit cung cấp cho chúng tôi mã MxLauncher. Tôi đang sử dụng webkit_iweb_view_load_uri (WEBKIT_IWEB_VIEW (chế độ xem), "filename.html"); API để tải tệp html của tôi để chạy javascript đó trên chế độ xem trang web của tôi.

Tôi đang liên kết .so được tạo tại thời gian biên dịch.

Thông báo lỗi: JS CONSOLE: file: ///filename.js: ReferenceError: Không thể tìm thấy biến: Ví dụ

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); 

Làm thế nào để có được mục tiêu của tôi để đạt được?

Trả lời

2

Bạn cũng cần nói với WebKit/JavaScriptCore khi chạy về các ràng buộc của bạn (đây là ngoài việc liên kết với filename_wrap.o).

Cụ thể là bạn cần phải liên kết chúng với đối tượng JavaScript chung (để gọi mỗi ví dụ .js của bạn). Một cuộc gọi lại trên cửa sổ WebKit có thể được sử dụng để tham khảo kịp thời ngữ cảnh JavaScript toàn cục, và sau đó bạn có thể đăng ký các chức năng của mình lên đó.

Thích ứng example này của hooking vào tín hiệu window-object-cleared mã có thể trông giống như thế này:

/* 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"); 

    ... 
} 

Tùy thuộc vào chi nhánh của SWIG bạn đang sử dụng bạn có thể cần phải tạo ra các example_init chức năng chính mình (kiểm tra tên tập tin. cxx); để tham khảo ở đây là những gì một chức năng khởi tạo để register wrapped C functions sẽ trông như thế nào trong SWIG:

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

LƯU Ý - SWIG vẫn chưa chính thức hỗ trợ JavaScript; ở trên đề cập đến việc sử dụng các nhánh SWIG (không sản xuất) đang hoạt động.

Tài liệu tham khảo:

Các vấn đề liên quan