aluateUCScriptForPrincip;處理統(tǒng)一碼的函數(shù)工作方式與原來(lái)的同名函數(shù)一樣,除;操作JS數(shù)據(jù)類型;JavaScript定義了他自己的數(shù)據(jù)類型;一般而言,你在應(yīng)用程序中聲明和使用JS數(shù)據(jù)類型就;操作JS值;除了JS數(shù)據(jù)類型之外,JS引擎也使用JS值,稱之;??????;JSVAL_IS_OBJECTJSVAL_IS_;Besidestest
aluateUCScriptForPrincipals JS_NewUCString JS_NewUCStringCopyN JS_NewUCStringCopyZ JS_InternUCString JS_InternUCStringN
處理統(tǒng)一碼的函數(shù)工作方式與原來(lái)的同名函數(shù)一樣,除了原來(lái)的函數(shù)使用參數(shù) char *,而統(tǒng)一碼版本的函數(shù)參數(shù)為 jschar *。
操作 JS 數(shù)據(jù)類型
JavaScript 定義了他自己的數(shù)據(jù)類型。其中一部分直接對(duì)應(yīng) C 中的副本。其他 的,諸如 JSObject,jsdouble, 和 JSString,對(duì) JavaScript 有特殊意義。
一般而言,你在應(yīng)用程序中聲明和使用 JS 數(shù)據(jù)類型就和使用標(biāo)準(zhǔn) C 數(shù)據(jù)類型一 樣。然而,JS 引擎對(duì) JS 數(shù)據(jù)類型,也就是需要超過(guò)一個(gè)字空間的變量變量 JSObject,jsdouble, 和 JSString 有不同的跟蹤。引擎周期性地檢查這些變量, 察看他們是否還在使用中。如果不再使用了,就收集他們,釋放存儲(chǔ)空間來(lái)重新 使用。 垃圾收集可以有效重復(fù)利用堆的資源, 但是過(guò)分頻繁的垃圾收集也會(huì)對(duì)性能造成 影響。你可以根據(jù) JS 運(yùn)行時(shí)控制垃圾收集的頻率,根據(jù)你給程序分配的 JS 運(yùn)行 時(shí)的大小和你應(yīng)用程序使用的 JS 變量和對(duì)象的數(shù)量之間的關(guān)系。如果你的程序 要?jiǎng)?chuàng)建和使用很多 JS 對(duì)象和變量,你可能就要分配足夠大的運(yùn)行時(shí)來(lái)減少垃圾 收集的可能頻率。 注意你的應(yīng)用程序要在任何時(shí)候調(diào)用同樣能 JS_GC 或者 JS_MaybeGC 來(lái)強(qiáng)制進(jìn)行 垃圾收集。 JS_GC 將強(qiáng)制進(jìn)行垃圾收集。 JS_MaybeGC 則會(huì)根據(jù)條件進(jìn)行垃圾收集, 如果你調(diào)用這個(gè)函數(shù)時(shí),初始化時(shí)分配的空間的特定比例已經(jīng)被使用的話,就進(jìn) 行垃圾收集。
操作 JS 值
除了 JS 數(shù)據(jù)類型之外,JS 引擎也使用 JS 值,稱之為 jsval。一個(gè) jsval 本質(zhì)上 是一個(gè)指向任意 JS 數(shù)據(jù)類型(除了整型)的一個(gè)指針。對(duì)于整型,jsval 直接 包含了他自身的整數(shù)值。在其他的情況下,指針還會(huì)被編碼,添加關(guān)于它所指的 數(shù)據(jù)的類型的額外信息。使用可以提高引擎的效率,同時(shí)也可以讓很多 API 函數(shù) 來(lái)處理不同類型的數(shù)據(jù)。 引擎 API 包含了一組用來(lái)測(cè)試 JS 值中的 JS 數(shù)據(jù)類型的宏。有:
JSVAL_IS_OBJECT JSVAL_IS_NUMBER JSVAL_IS_INT JSVAL_IS_DOUBLE JSVAL_IS_STRING JSVAL_IS_BOOLEAN
Besides testing ajsval,你也可以檢測(cè)他是否屬于一個(gè)基本 JS 數(shù)據(jù)類型 (JSVAL_IS_PRIMITIVE)。基本類型包括未定義(undefined)、空(null)、 布 爾(boolean)、數(shù)值(numeric)和字符串(string)類型。 你可以測(cè)試 jsval 所指的值是否為 NULL(JSVAL_IS_NULL) 或者 void(JSVAL_IS_VOID)。 如果 jsval 指向了一個(gè) JS 數(shù)據(jù)類型是 JSObject,jsdouble, 或者 jsstr, 你可以 將 jsval 轉(zhuǎn)換成他的內(nèi)在的類型,只要相應(yīng)使用 JSVAL_TO_OBJECT,JSVAL_TO_DOUBLE 和 JSVAL_TO_STRING。在某些情況下,你的
應(yīng)用程序或者 JS 引擎調(diào)用要求使用一個(gè)特定的數(shù)據(jù)類型的變量或者參數(shù)而非一 個(gè) jsval 時(shí),就很有用了。類似地,你可以使用 OBJECT_TO_JSVAL,DOUBLE_TO_JSVAL, 和 STRING_TO_JSVAL, 把 JSObject,jsdouble, 和 jsstr 相應(yīng)地轉(zhuǎn)換成 jsval。
操作 JS 字符串
在 JavaScript 中你的很多工作都回涉及字符串。JS 引擎實(shí)現(xiàn)了一個(gè) JS 字符串 類型,JSString,一個(gè)指向 JS 字符—jschar—數(shù)組的指針,用來(lái)處理支持統(tǒng)一 碼的字符串。引擎也實(shí)現(xiàn)了一系列豐富的通用和統(tǒng)一碼字符串管理程序。最后, JS 引擎提供了對(duì)限定字符串的支持,這可以將兩個(gè)或多個(gè)相同的字符串創(chuàng)建時(shí) 在內(nèi)存中共享一個(gè)單獨(dú)的實(shí)例。對(duì)于 JSString 類型的字符串,引擎會(huì)跟蹤和管 理字符串資源。 通常情況下,當(dāng)你在處理 JS 引擎使用的字符串時(shí),你應(yīng)該使用 JS API 中的字符 串處理函數(shù)來(lái)創(chuàng)建和復(fù)制字符串。 還有創(chuàng)建以空字符結(jié)尾的和特定長(zhǎng)度的字符串 的例程,以及獲取字符串長(zhǎng)度和比較字符串。
統(tǒng)一碼字符串支持
使用統(tǒng)一碼(Unicode)的 API 字符串函數(shù)的名稱和標(biāo)準(zhǔn)的引擎 API 字符串行數(shù) 是一一對(duì)應(yīng)的,規(guī)則如下:如果標(biāo)準(zhǔn)函數(shù)名是 JS_NewStringCopyN,相應(yīng)的統(tǒng)一 碼版本就是 JS_NewUCStringCopyN。同樣有針對(duì)限定字符串的支持統(tǒng)一碼的 API 字符串函數(shù)。
限定字符串支持
為了節(jié)省存儲(chǔ)空間,JS 引擎提供了對(duì)共享一個(gè)單獨(dú)的字符串實(shí)例支持,這些字 符串屬于一些獨(dú)立的不可變化的文字。這種被共享的字符串被稱為“限定字符 串”(interned string)。當(dāng)你覺(jué)得某個(gè)特定的文本會(huì)被創(chuàng)建并且反復(fù)在程序 中使用多次的話,那可以使用限定字符串。 引擎的 API 提供了幾種工作于限定字符串的函數(shù)調(diào)用:
JS_InternString, 用來(lái)創(chuàng)建或者復(fù)用一個(gè) JSString. JS_InternUCString, 用來(lái)創(chuàng)建或者復(fù)用一個(gè)統(tǒng)一碼的 JSString. JS_InternUCStringN, 用以創(chuàng)建或者復(fù)用一個(gè)固定長(zhǎng)度的統(tǒng)一碼 JSString。
管理安全性
現(xiàn)在使用 JavaScript 1.3,JS 引擎加入了安全性增強(qiáng) API 函數(shù)來(lái)編譯和執(zhí)行傳 送給引擎的腳本和函數(shù)。JS 安全模型是基于 Java 的基本安全模型的。該模型提 供了一個(gè)公共安全接口,但是實(shí)際的安全控制由你去實(shí)現(xiàn)。 在使用 JavaScript 的應(yīng)用中使用安全管理的一個(gè)常用的方法是比較腳本的來(lái)源 和限制腳本的交互。例如,你可能會(huì)比較兩個(gè)或多個(gè)腳本的代碼源并且只允許來(lái) 自相同的代碼源的腳本修改共享代碼源的腳本的屬性。 如要實(shí)現(xiàn)安全 JS,請(qǐng)按照以下幾步: 1. 在代碼中聲明一個(gè)或多個(gè) JSPrincipals 類型的結(jié)構(gòu)體(struct)。 2. 把實(shí)現(xiàn)了安全信息的函數(shù)列表添加到數(shù)組中。 這些包括了為程序提供原則 數(shù)組的函數(shù),和使用給定原則的 JS 對(duì)象的引用計(jì)數(shù)增減機(jī)制。 3. 把 JSPrincipals 結(jié)構(gòu)和你的安全信息組裝起來(lái)。這個(gè)信息可以包括一般 代碼源信息。 4. 在運(yùn)行時(shí),使用一些特定的 JS API 調(diào)用來(lái)編譯和執(zhí)行所有要應(yīng)用安全性 的腳本和函數(shù),他們將要求傳遞一個(gè) JSPrincipals 結(jié)構(gòu)。下面的表格列 出了這些 API 函數(shù)和他們的作用: 函數(shù) JS_CompileScriptForPrincipals JS_CompileUCScriptForPrincipals JS_CompileFunctionForPrincipals JS_CompileUCFunctionForPrincipals JS_EvaluateScriptForPrincipals JS_EvaluateUCScriptForPrincipals 目的 編譯(但是不執(zhí)行)一個(gè)啟用安 全控制的腳本。 編譯(但不執(zhí)行)一個(gè)啟用安全 控制、統(tǒng)一碼編碼的腳本。 從一個(gè)文本串創(chuàng)建一個(gè)啟用安全 控制的 JS 函數(shù)。 從一個(gè)統(tǒng)一碼編碼的字符串中創(chuàng) 建一個(gè)帶安全信息的 JS 函數(shù)。 編譯和執(zhí)行一個(gè)啟用安全控制的 腳本。 編譯并執(zhí)行一個(gè)啟用安全控制且 用統(tǒng)一碼編碼的腳本。
This entry was posted on 星期日, 四月 2nd, 2006 at 4:29 pm and is filed under JavaScript, C. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
3 Responses to “JavaScript-C 引擎嵌入開(kāi)發(fā)指南”
1. liaoyan Says:
五月 28th, 2006 at 2:32 pm
ok, thx. 2. billconan Says:
九月 15th, 2006 at 1:23 am
這個(gè)貌似是 firefox 的 js 引擎 spider monkey。我的那個(gè) 3d 建模工具本 來(lái)要搞個(gè)腳本語(yǔ)言的, 看過(guò)一些這個(gè)東西。 不過(guò)現(xiàn)在要先實(shí)現(xiàn)基本的功能, 這個(gè)以后再考慮。不過(guò)很可能以后用 Python 了。 3. ShiningRay Says:
九月 15th, 2006 at 2:14 pm
@Billconan 就是 Spider Monkey 其原名 JavaScript-C 其實(shí) Lua 的性能比 Python 更好一些,不過(guò) Python 的應(yīng)用更多
How to start up the VM and Execute a Script
Without any error checking for: null returns from JS_ functions that return pointers false returns from JS_ functions that return booleans (errors are conventionally saved in a JSBool variable named ok).
JSRuntime *rt; JSContext *cx; JSObject *global; JSClass global_class = { "global",0, JS_PropertyStub,JS_PropertyStub,JS_PropertyStub,JS_PropertyStub, JS_EnumerateStub,JS_ResolveStub,JS_ConvertStub,JS_FinalizeStub };
/* * You always need: * a runtime per process, * a context per thread, * a global object per context, * standard classes (e.g. Date). */
rt = JS_NewRuntime(0x100000);
cx = JS_NewContext(rt, 0x1000); global = JS_NewObject(cx, &global_class, NULL, NULL); JS_InitStandardClasses(cx, global);
/* * Now suppose script contains some JS to evaluate, say "22/7" as a * bad approximation for Math.PI, or something longer, such as this: * "(function fact(n){if (n <= 1) return 1; return n * fact(n-1)})(5)" * to compute 5! */
char *script = "..."; jsval rval; JSString *str; JSBool ok; ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno, &rval); str = JS_ValueToString(cx, rval); printf("script result: %s\n", JS_GetStringBytes(str));
How to call C functions from JavaScript
Say the C function is named doit and it would like at least two actual parameters when called (if the caller supplies fewer, the JS engine should ensure that undefined is passed for the missing ones):
#define DOIT_MINARGS 2 static JSBool doit(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
/* * Look in argv for argc actual parameters, set *rval to return a * value to the caller. */
...
}
Then to wire it up to JS, you could write:
ok = JS_DefineFunction(cx, global, "doit", doit, DOIT_MINARGS, 0);
Or, if you had a bunch of native functions to define, you would probably put them in a table:
static JSFunctionSpec my_functions[] = { {"doit", doit, DOIT_MINARGS, 0, 0}, etc...
{0,0,0,0,0}, };
(the final, all-zeroes function specifier terminates the table) and say:
ok = JS_DefineFunctions(cx, global, my_functions);
How to call JavaScript functions from C (such as "onClick")
Say the click event is for the top-most or focused UI element at position (x, y):
JSObject *target, *event; jsval argv[1], rval;
/* * Find event target and make event object to represent this click. * Pass cx to NewEventObject so JS_NewObject can be called. */
target = FindEventTargetAt(cx, global, x, y); argv[0] = OBJECT_TO_JSVAL(event); event = NewEventObject(cx, "click", x, y);
/* To emulate the DOM, you might want to try "onclick" too. */
ok = JS_CallFunctionName(cx, target, "onClick", 1, argv, &rval);
/* Now test rval to see whether we should cancel the event. */
if (JSVAL_IS_BOOLEAN(rval) && !JSVAL_TO_BOOLEAN(rval)) CancelEvent(event);
Again, I've elided error checking (such as testing for !ok after the call), and I've faked up some C event management routines that emulate the DOM's convention of canceling an event if its handler returns false.
功能強(qiáng)大的 JavaScript 引擎--SpiderMonkey JavaScript 在瀏覽器中的應(yīng)用幾乎是盡人皆知的。實(shí)際上,JavaScript 技術(shù)也可以使用在非瀏
覽器應(yīng)用程序當(dāng)中,從而讓應(yīng)用程序具有自動(dòng)的腳本功能。本文介紹了一種功能非常強(qiáng)大的
JavaScript 引擎 SpiderMonkey。這個(gè)引擎是 Mozilla 瀏覽器的 JavaScript 引擎。該引擎接
口定義清晰,模塊化好。本文簡(jiǎn)要介紹了 SpiderMonkey 的基本結(jié)構(gòu),并講解了如何在自己的 應(yīng)用程序中使用該引擎,最后給出了一個(gè)樣例程序。該程序能夠解釋執(zhí)行 JavaScript 腳本完成 簡(jiǎn)單的腳本功能。
JavaScript 是由 Netscape 開(kāi)發(fā)的對(duì)象腳本語(yǔ)言,其特點(diǎn)是開(kāi)發(fā)簡(jiǎn)單、功能靈活,目前已廣泛 應(yīng)用于 WEB 頁(yè)面及服務(wù)器應(yīng)用程序中。 HTML 本身是靜態(tài)的、 不允許用戶干預(yù), 但用 JavaScript 編寫的腳本程序就可以在用戶的瀏覽器端運(yùn)行,可以同用戶進(jìn)行交互,從而實(shí)現(xiàn)動(dòng)態(tài)頁(yè)面??梢?將 JavaScript 與嵌入 WEB 的大多數(shù)對(duì)象的事件(如鼠標(biāo)點(diǎn)擊、移動(dòng)等)相關(guān)聯(lián),然后用自己 的方式處理這些事件。JavaScript 提供了豐富的內(nèi)置函數(shù)及命令,能在瀏覽器中顯示 HTML、 數(shù)值計(jì)算、多媒體播放、超級(jí)鏈接以及簡(jiǎn)單的交互窗口等,還可以使在瀏覽器中運(yùn)行的小 Java 應(yīng)用程序的性質(zhì)改變從而很容易地改變控件或其它對(duì)象的行為而不必深入研究其本身的結(jié)構(gòu)。 JavaScript 雖然是為 Internet 而開(kāi)發(fā)的,但它的應(yīng)用卻不僅僅局限于 Internet,事實(shí)上由于 其面向?qū)ο蟮奶匦允沟闷溥m用范圍非常廣泛, 只要我們的應(yīng)用程序具有良好的對(duì)象機(jī)制, 我們就 可以借用 JavaScript,從而實(shí)現(xiàn)很好的交互功能。 SpiderMonkey 是由 C 語(yǔ)言操作的 JavaScript 引擎,它支持 JS1.4 和 ECMAScript-262 規(guī) 范。該引擎分析、編譯和執(zhí)行腳本,根據(jù) JS 數(shù)據(jù)類型和對(duì)象的需要進(jìn)行內(nèi)存分配及釋放操作。 利用該引擎可以讓你的應(yīng)用程序具有解釋 JavaScript 腳本的能力,目前已有若干個(gè)項(xiàng)目都采用 了 SpiderMonkey 引擎,像 K-3D、WebCrossing、WebMerger 等。K-3D 是用 C++實(shí)現(xiàn) 的 3D 建模與仿真系統(tǒng),該系統(tǒng)內(nèi)嵌 SpiderMonkey 引擎來(lái)提供自定義腳本(用戶創(chuàng)建腳本生 成像齒輪一樣具有重復(fù)特性的復(fù)雜形體),也可用來(lái)驅(qū)動(dòng)交互式的教學(xué)系統(tǒng)(用戶可以使用一段 JS 腳本程序記錄其交互過(guò)程,如移動(dòng)鼠標(biāo)、選擇菜單、點(diǎn)擊鼠標(biāo)等)。WebCrossing 利用 SpiderMonkey 實(shí)現(xiàn)了服務(wù)器端的腳本環(huán)境,提供了完全的 Web-server 腳本環(huán)境,服務(wù)器端 的實(shí)現(xiàn)允許你在內(nèi)置的、 面
三億文庫(kù)包含各類專業(yè)文獻(xiàn)、專業(yè)論文、文學(xué)作品欣賞、中學(xué)教育、生活休閑娛樂(lè)、行業(yè)資料、應(yīng)用寫作文書、58JavaScript-C引擎嵌入開(kāi)發(fā)指南等內(nèi)容。
12345