2012-12-03 2 views
12

मेरा लक्ष्य वेब ऐप्स बनाने के लिए सी पुस्तकालयों का उपयोग करना है।वेबस्पेप में सी आधारित एपीआई (अव्यवस्था) का उपयोग करने के लिए जावास्क्रिप्ट एक्सटेंशन

मैंने "SWIG" टूल का उपयोग करके ऐसा करने का तरीका चुना है। बड़ा घूँट उपकरण तीन बातें

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

मैं संकलन और .js फ़ाइल ठीक से बना दिया है सत्यापित करने के लिए इस एप्लिकेशन को चलाने के लिए बड़ा घूँट उपकरण का उपयोग किया की आवश्यकता है। एप्लिकेशन XMING X11 विंडो पर ठीक चल रहा है।

संकलन पर यह _wrap.o, ओ फ़ाइल और libFILENAME.so

अब मैं ब्राउज़र पृष्ठ पर इस एप्लिकेशन चलाना चाहते हैं बनाता है।

इसके लिए मैंने वेबकिट क्लटर पोर्ट का उपयोग किया है जो हमें एमएक्सएलएचर कोड देता है। मैं webkit_iweb_view_load_uri (WEBKIT_IWEB_VIEW (देखें), "filename.html") का उपयोग कर रहा हूं; मेरे वेबपृष्ठ दृश्य पर जावास्क्रिप्ट चलाने के लिए मेरी एचटीएमएल फ़ाइल लोड करने के लिए एपीआई।

मैं संकलन समय पर बनाए गए .so को जोड़ रहा हूं।

त्रुटि संदेश: जे एस कंसोल: फ़ाइल: ///filename.js: ReferenceError: चर नहीं मिली: उदाहरण

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

मेरा लक्ष्य कैसे प्राप्त किया जा करने के लिए पाने के लिए?

उत्तर

2

आपको अपने बाइंडिंग के बारे में रनटाइम पर वेबकिट/जावास्क्रिप्टकोर को भी बताना होगा (यह filename_wrap.o से जुड़ने के अतिरिक्त है)।

विशेष रूप से आपको उन्हें वैश्विक जावास्क्रिप्ट ऑब्जेक्ट (अपने .js उदाहरणों के प्रति आमंत्रित करने के लिए) को बाध्य करने की आवश्यकता है। वेबकिट विंडो पर एक कॉलबैक का उपयोग वैश्विक जावास्क्रिप्ट संदर्भ पर समय पर संदर्भ प्राप्त करने के लिए किया जा सकता है, और फिर आप अपने कार्यों को उस पर पंजीकृत कर सकते हैं।

window-object-cleared संकेत में hooking के इस example अनुकूल कोड कुछ ऐसा दिखाई दे सकता है:

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

    ... 
} 

निर्भर करता है बड़ा घूँट की किस शाखा का प्रयोग कर रहे हैं आप example_init समारोह अपने आप को उत्पन्न करने के लिए आवश्यकता हो सकती है (फ़ाइल नाम की जाँच करें। CXX); संदर्भ के लिए यहाँ register wrapped C functions के लिए एक प्रारंभकर्ता समारोह बड़ा घूँट में कैसा दिखेगा क्या है:

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

नोट - बड़ा घूँट अभी तक आधिकारिक तौर जावास्क्रिप्ट का समर्थन नहीं करता; उपरोक्त कार्य प्रगति (गैर-उत्पादन) एसडब्ल्यूआईजी शाखाओं का उपयोग करने के लिए संदर्भित करता है।

संदर्भ:

  • बड़ा घूँट-वी 8 source और उसके Javascript documentation
  • बड़ा घूँट-JSC source और दर्ज की बाइंडिंग
  • बड़ा घूँट JavaScriptCore GSoC परियोजना source (कोड 2012 के Google ग्रीष्मकालीन)
  • के अपने example
  • वेबकिट: जावास्क्रिप्ट आलेख का विस्तार - tutorial/example code
संबंधित मुद्दे

 संबंधित मुद्दे