亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法和系統(tǒng)的制作方法

文檔序號(hào):6510978閱讀:219來(lái)源:國(guó)知局
一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法和系統(tǒng)的制作方法【專(zhuān)利摘要】本發(fā)明涉及一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法和系統(tǒng),所述方法包括:應(yīng)用程序或組件在接收到需要調(diào)用其它組件中的相應(yīng)功能指令時(shí),查找所述其它組件,所述其它組件提供標(biāo)準(zhǔn)插件接口,具有唯一標(biāo)識(shí)其身份的“MIMEType”;查找到所述組件后,將所述組件加載到內(nèi)存中,并獲取創(chuàng)建所述組件實(shí)例的接口以及調(diào)用所述組件的相應(yīng)功能接口;在不需要所述的相應(yīng)功能時(shí),調(diào)用卸載組件接口,將所述其他組件卸載。本發(fā)明實(shí)施例所述接口為標(biāo)準(zhǔn)插件接口,在編譯時(shí)不鏈接組件,在應(yīng)用程序啟動(dòng)時(shí)不加載不必要的組件,節(jié)省了內(nèi)存,避免了針對(duì)不同業(yè)務(wù)形態(tài)的嵌入式系統(tǒng)生成不同版本的應(yīng)用程序?!緦?zhuān)利說(shuō)明】一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法和系統(tǒng)【
技術(shù)領(lǐng)域
】[0001]本發(fā)明涉及計(jì)算機(jī)應(yīng)用程序發(fā)現(xiàn)和組件加載【
技術(shù)領(lǐng)域
】,尤其涉及一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法和系統(tǒng)。【
背景技術(shù)
】[0002]目前,組件技術(shù)被廣泛應(yīng)用于嵌入式系統(tǒng)中。在嵌入式系統(tǒng)中,系統(tǒng)的業(yè)務(wù)形態(tài)較多,不同形態(tài)下中間件或應(yīng)用程序的功能不同,需加載的組件也不同,現(xiàn)有技術(shù)通常是在編譯時(shí)必須鏈接組件,這樣對(duì)于相同的中間件或應(yīng)用程序,需要為每個(gè)業(yè)務(wù)形態(tài)的系統(tǒng)鏈接不同的組件,生成不同版本,使用這種方法使得中間件或應(yīng)用程序后續(xù)的軟件維護(hù)工作量大。此外,嵌入式系統(tǒng)包括內(nèi)存在內(nèi)的硬件資源非常有限,編譯鏈接組件庫(kù)后,在應(yīng)用程序啟動(dòng)時(shí)就加載所有組件,不必要地耗費(fèi)了內(nèi)存。[0003]現(xiàn)有動(dòng)態(tài)加載組件流程都是私有的,都是通過(guò)定義一些私有函數(shù)接口實(shí)現(xiàn)對(duì)組件庫(kù)的查找和對(duì)組件庫(kù)方法的調(diào)用,這種方法限制了其通用型,封裝的接口只對(duì)某個(gè)具體的組件庫(kù)有效,對(duì)別的組件庫(kù)就沒(méi)有作用了?!?br/>發(fā)明內(nèi)容】[0004]本發(fā)明的目的在于,為克服上述問(wèn)題,本發(fā)明提出一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法和系統(tǒng)。[0005]為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種嵌入式系統(tǒng)的動(dòng)態(tài)加載組件的方法,所述方法包含:[0006]步驟101)封裝組件庫(kù);[0007]步驟102)當(dāng)某個(gè)應(yīng)用程序或組件收到需要調(diào)用另一個(gè)組件中的相應(yīng)功能指令時(shí),依據(jù)標(biāo)識(shí)該另一組件身份的“MMEType”,遍歷系統(tǒng)中的各組件庫(kù)的“MMEType”來(lái)查找所述其它組件;[0008]步驟103)當(dāng)查找到所需組件后,在內(nèi)存中加載所需組件,并獲取創(chuàng)建所需組件實(shí)例的接口以及調(diào)用所需組件的相應(yīng)功能接口;[0009]其中,所有組件均具有唯——個(gè)標(biāo)識(shí)其身份的“MMEType”。[0010]上述步驟103)之后還包含:[0011]調(diào)用卸載組件接口,卸載加載的組件。[0012]采用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝組件庫(kù)。[0013]采用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝組件庫(kù)的方法具體包含如下步驟:[0014]在編譯組件庫(kù)的時(shí)候加入npruntime.h、np_entry.cpp、npn_gate.cpp、npp_gate.cpp以及設(shè)置插件調(diào)用接口的def文件;所述npruntime.h為頭文件,np_entry.cpp、npn_gate,cpp、npp_gate.cpp為接口函數(shù),且接口函數(shù)np_entry.cpp、npn_gate.cpp和npp_gate,cpp定義在npruntime.h頭文件中;[0015]其中,[0016]np_entry.cpp中定義了三個(gè)接口,分別是:[0017]NP_GetEntryPoints-在插件加載之后立即調(diào)用該接口,用于瀏覽器獲取所有可能需要調(diào)用的API函數(shù)的指針;[0018]NP_Initialize-為插件提供全局初始化;[0019]NP_Shutdown-為插件提供全局反初始化;[0020]npn_gate.cpp文件用于實(shí)現(xiàn)20個(gè)函數(shù)接口,且這些接口是由瀏覽器實(shí)現(xiàn)的;在插件實(shí)例初始化的時(shí)候,將瀏覽器實(shí)現(xiàn)的這些函數(shù)的入口地址保存到一個(gè)NPNetscapeFuncs結(jié)構(gòu)中,這些函數(shù)的實(shí)現(xiàn)就直接根據(jù)NPNetscapeFuncs結(jié)構(gòu)中的入口地址調(diào)用瀏覽器實(shí)現(xiàn)的相關(guān)功能;且在開(kāi)發(fā)插件時(shí)只需要調(diào)用NPN_開(kāi)頭的全局函數(shù)即可;[0021]npp_gate.cpp文件用于實(shí)現(xiàn)包含如下幾個(gè)函數(shù)接口:[0022]NPP_ShutdownO:在卸載一個(gè)插件DLL之前及刪除任何插件實(shí)例之后調(diào)用;[0023]NPP_New():在創(chuàng)建一個(gè)插件實(shí)例時(shí)調(diào)用,用來(lái)初始化插件的實(shí)例數(shù)據(jù)結(jié)構(gòu);[0024]NPP_Destroy():在刪除一個(gè)插件實(shí)例時(shí)調(diào)用,用于釋放為插件實(shí)例所分配的空間;[0025]NPP_GetMIMEDescript1n():僅用于Unix環(huán)境,用于獲取由該插件所支持的MIME類(lèi)型;[0026]其中,Def文件用來(lái)設(shè)置插件供外部調(diào)用的接口,接口一般有三個(gè),分別是NP_GetEntryPoints、NP_Initialize和NP_Shutdown;[0027]當(dāng)組件庫(kù)完成封裝之后,如果某個(gè)應(yīng)用程序或組件需要調(diào)用采用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝的組件庫(kù)的時(shí)候,通過(guò)調(diào)用NP_GetEntryPoints、NP_Initialize和NP_Shutdown這三個(gè)接口實(shí)現(xiàn)對(duì)組件庫(kù)方法的調(diào)用。瀏覽器在組件加載后調(diào)用NP_GetEntryPoints接口,獲取所有可能需要調(diào)用的API函數(shù)的指針,獲取的函數(shù)指針中就包含有NP_Initialize接口函數(shù)指針;然后調(diào)用NP_Initialize接口對(duì)組件進(jìn)行全局初始化,初始化后獲得一系列NPN類(lèi)和NPP類(lèi)函數(shù)接口的指針,獲得的NPP類(lèi)函數(shù)接口的指針中就包含有NPP_GetMIMEDescript1n接口函數(shù)指針;通過(guò)調(diào)用NPP_GetMIMEDescript1n接口函數(shù),就能獲得該組件支持的“MMEType”。[0028]遍歷系統(tǒng)中各組件庫(kù)的特征接口進(jìn)而查找所需組件;[0029]組件封裝之后,把封裝好的組件文件放在指定目錄下,當(dāng)解析頁(yè)面遇到需要調(diào)用組件的方法時(shí),加載所需組件;加載所需組件前,應(yīng)用程序或組件首先遍歷系統(tǒng)中的各組件庫(kù)的“MMEType”來(lái)查找所述組件,找到與指定所需組件的“MMEType”值相同的組件,進(jìn)而加載所需組件。[0030]上述步驟103)進(jìn)一步包含:[0031]加載組件時(shí)會(huì)調(diào)用NP_InitializeO進(jìn)行初始化,初始化后獲得一系列NPN類(lèi)和NPP類(lèi)函數(shù)接口的指針,然后調(diào)用NPP_New()函數(shù)接口創(chuàng)建組件實(shí)例并初始化,實(shí)例對(duì)象的構(gòu)造函數(shù)中會(huì)生成ScriptablePluginObject對(duì)象,倉(cāng)Il建組件實(shí)例后,當(dāng)遇到需要調(diào)用組件中的方法,根據(jù)組件方法的名稱(chēng),去調(diào)用ScriptablePluginObject:HasMethod來(lái)判斷是否有這個(gè)方法,如果有這個(gè)方法,則會(huì)觸發(fā)ScriptablePluginObject::1nvoke函數(shù)運(yùn)行,invoke函數(shù)內(nèi)部根據(jù)方法名稱(chēng)實(shí)現(xiàn)對(duì)應(yīng)的操作。[0032]此外,本發(fā)明還提供了一種嵌入式系統(tǒng)的動(dòng)態(tài)加載組件的系統(tǒng),所述系統(tǒng)包含:[0033]封裝模塊,用于把組件用插件標(biāo)準(zhǔn)NPAPI接口封裝,實(shí)現(xiàn)像調(diào)用標(biāo)準(zhǔn)插件那樣通過(guò)標(biāo)準(zhǔn)接口去查找組件并調(diào)用組件的方法;[0034]查找模塊,用于遍歷存放有多個(gè)組件庫(kù)的目錄,尋找到所需要調(diào)用的組件庫(kù);和調(diào)用模塊,用于查找所需組件庫(kù)后去調(diào)用具體的方法實(shí)現(xiàn)相應(yīng)的功能。[0035]與現(xiàn)有技術(shù)相比,本發(fā)明的技術(shù)優(yōu)勢(shì)在于:本【
發(fā)明內(nèi)容】是基于標(biāo)準(zhǔn)插件流程的,封裝組件庫(kù)所用的接口函數(shù)不是自己定義的私有接口函數(shù),而是插件標(biāo)準(zhǔn)NPAPI接口函數(shù)。本專(zhuān)利【
發(fā)明內(nèi)容】的的封裝規(guī)則同時(shí)適用于多個(gè)組件庫(kù),組件庫(kù)只要按本專(zhuān)利的方法封裝,第三方庫(kù)或者應(yīng)用程序就可以通過(guò)標(biāo)準(zhǔn)接口實(shí)現(xiàn)對(duì)組件庫(kù)的查找以及對(duì)組件庫(kù)方法的調(diào)用,不用具體區(qū)分是哪個(gè)組件庫(kù),大大提高了動(dòng)態(tài)加載組件的通用性?!緦?zhuān)利附圖】【附圖說(shuō)明】[0036]圖1是本發(fā)明實(shí)施例的嵌入式瀏覽器動(dòng)態(tài)查找和加載組件流程示意圖;[0037]圖2是本發(fā)明實(shí)施例嵌入式系統(tǒng)組件加載方法示意圖?!揪唧w實(shí)施方式】[0038]下面通過(guò)附圖和實(shí)施例,對(duì)本發(fā)明實(shí)施例的技術(shù)方案做進(jìn)一步的詳細(xì)描述。[0039]本發(fā)明提供了一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法,所述方法包括:[0040]應(yīng)用程序或組件在接收到需要調(diào)用標(biāo)準(zhǔn)插件NPAPI封裝的其它組件中的相應(yīng)功能指令時(shí),查找所述其它組件,所述其它組件具有唯一標(biāo)識(shí)其身份的“MMEType”;[0041]查找到所述組件后,將所述組件加載到內(nèi)存中,并獲取創(chuàng)建所述組件實(shí)例的接口以及調(diào)用所述組件的相應(yīng)功能接口;[0042]在不需要所述的相應(yīng)功能時(shí),調(diào)用卸載組件接口,將所述其他組件卸載。[0043]上述其它組件使用標(biāo)準(zhǔn)插件接口NPAPI封裝;[0044]上述查找其他組件的方法符合標(biāo)準(zhǔn)插件加載過(guò)程,具體為:遍歷系統(tǒng)中各組件庫(kù)的特征接口來(lái)查找所述其它組件;加載所述其它組件前,應(yīng)用程序或組件首先會(huì)取得平臺(tái)上存在的所有所述其它組件類(lèi)型,保存所述其它組件的路徑和名稱(chēng),然后在解析網(wǎng)頁(yè)遇到指定插件時(shí),會(huì)去遍歷系統(tǒng)中的各組件庫(kù)的“MMEType”值,找到與指定所述其它組件的"MIMEType”值相同的組件庫(kù),進(jìn)而加載正確的所述其它組件。[0045]優(yōu)選地,應(yīng)用程序或組件啟動(dòng)時(shí)不加載所述其它組件。[0046]優(yōu)選地,應(yīng)用程序在編譯階段時(shí)不鏈接所述其它組件。[0047]優(yōu)選地,所述其它組件具有唯一標(biāo)識(shí)其身份的“MMEType”,具體為:不同的所述其它組件擁有不同的“MMEType”類(lèi)型,這是表示所述其它組件本身唯一的標(biāo)識(shí)。應(yīng)用程序或組件就是通過(guò)此類(lèi)型標(biāo)識(shí)來(lái)識(shí)別特定的插件,進(jìn)而調(diào)用所述其它組件的API函數(shù)。[0048]采用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝組件庫(kù)的方法具體包含如下步驟:[0049]在編譯組件庫(kù)的時(shí)候加入npruntime.h、np_entry.cpp、npn_gate.cpp、npp_gate.cpp以及設(shè)置插件調(diào)用接口的def文件;所述npruntime.h為頭文件,np_entry.cpp、npn_gate,cpp、npp_gate.cpp為接口函數(shù),且接口函數(shù)np_entry.cpp、npn_gate.cpp和npp_gate,cpp定義在npruntime.h頭文件中;[0050]其中,[0051]np_entry.cpp中定義了三個(gè)接口,分別是:[0052]NP_GetEntryPoints-在插件加載之后立即調(diào)用該接口,用于瀏覽器獲取所有可能需要調(diào)用的API函數(shù)的指針;[0053]NP_Initialize-為插件提供全局初始化;[0054]NP_Shutdown-為插件提供全局反初始化;[0055]npn_gate.cpp文件用于實(shí)現(xiàn)20個(gè)函數(shù)接口,且這些接口是由瀏覽器實(shí)現(xiàn)的;在插件實(shí)例初始化的時(shí)候,將瀏覽器實(shí)現(xiàn)的這些函數(shù)的入口地址保存到一個(gè)NPNetscapeFuncs結(jié)構(gòu)中,這些函數(shù)的實(shí)現(xiàn)就直接根據(jù)NPNetscapeFuncs結(jié)構(gòu)中的入口地址調(diào)用瀏覽器實(shí)現(xiàn)的相關(guān)功能;且在開(kāi)發(fā)插件時(shí)只需要調(diào)用NPN_開(kāi)頭的全局函數(shù)即可;[0056]npp_gate.cpp文件用于實(shí)現(xiàn)包含如下幾個(gè)函數(shù)接口:[0057]NPP_Shutdown():在卸載一個(gè)插件動(dòng)態(tài)鏈接庫(kù)之前及刪除任何插件實(shí)例之后調(diào)用;[0058]NPP_New():在創(chuàng)建一個(gè)插件實(shí)例時(shí)調(diào)用,用來(lái)初始化插件的實(shí)例數(shù)據(jù)結(jié)構(gòu);[0059]NPP_DestroyO:在刪除一個(gè)插件實(shí)例時(shí)調(diào)用,用于釋放為插件實(shí)例所分配的空間;[0060]NPP_GetMIMEDescript1n():僅用于Unix環(huán)境,用于獲取由該插件所支持的MIME類(lèi)型;[0061]其中,Def文件用來(lái)設(shè)置插件供外部調(diào)用的接口,接口一般有三個(gè),分別是NP_GetEntryPoints、NP_Initialize和NP_Shutdown;[0062]當(dāng)組件庫(kù)完成封裝之后,如果某個(gè)應(yīng)用程序或組件需要調(diào)用采用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝的組件庫(kù)的時(shí)候,通過(guò)調(diào)用NP_GetEntryPoints、NP_Initialize和NP_Shutdown這三個(gè)接口實(shí)現(xiàn)對(duì)組件庫(kù)方法的調(diào)用。瀏覽器在組件加載后調(diào)用NP_GetEntryPoints接口,獲取所有可能需要調(diào)用的API函數(shù)的指針,獲取的函數(shù)指針中就包含有NP_Initialize接口函數(shù)指針;然后調(diào)用NP_Initialize接口對(duì)組件進(jìn)行全局初始化,初始化后獲得一系列NPN類(lèi)和NPP類(lèi)函數(shù)接口的指針,獲得的NPP類(lèi)函數(shù)接口的指針中就包含有NPP_GetMIMEDescript1n接口函數(shù)指針;通過(guò)調(diào)用NPP_GetMIMEDescript1n接口函數(shù),就能獲得該組件支持的“MMEType”。[0063]本發(fā)明實(shí)施例所述接口為標(biāo)準(zhǔn)插件的NPAPI接口,在編譯時(shí)不鏈接組件,在應(yīng)用程序啟動(dòng)時(shí)不加載不必要的組件,節(jié)省了內(nèi)存,避免了針對(duì)不同業(yè)務(wù)形態(tài)的嵌入式系統(tǒng)生成不同版本的應(yīng)用程序。[0064]實(shí)施例1:[0065]本發(fā)明實(shí)施例包含以下步驟:[0066]步驟1,為各組件配置具有可唯一標(biāo)識(shí)其身份的“MMEType”。[0067]步驟2,應(yīng)用程序或其他組件在接收到需要調(diào)用其它組件相應(yīng)功能指令時(shí),通過(guò)遍歷系統(tǒng)中指定目錄下各組件庫(kù)的特征接口來(lái)查找組件;所述的遍歷手段在順序上沒(méi)有先后限制。[0068]步驟3,如果存在該組件,則將組件加載到內(nèi)存中,并獲取組件實(shí)例、調(diào)用封裝組件的插件標(biāo)準(zhǔn)NPAPI接口;[0069]步驟4,在退出相應(yīng)功能模塊時(shí),卸載組件,釋放內(nèi)存。[0070]其中,唯一標(biāo)識(shí)組件身份的“MMEType”可使用以下方法:[0071]把唯一標(biāo)識(shí)組件身份的“MIMEType”設(shè)置為applicat1n/χ-組件名稱(chēng)。[0072]本發(fā)明實(shí)施例根據(jù)嵌入式系統(tǒng)的特點(diǎn),只在具備組件功能的系統(tǒng)中以及在啟動(dòng)組件功能時(shí)加載組件,避免了應(yīng)用程序?yàn)椴煌瑯I(yè)務(wù)形態(tài)的系統(tǒng)生成不同版本,減少了應(yīng)用程序啟動(dòng)時(shí)加載組件耗費(fèi)的內(nèi)存。[0073]實(shí)施例2[0074]下面通過(guò)一個(gè)優(yōu)選實(shí)施例對(duì)本發(fā)明實(shí)施例的方法做進(jìn)一步闡述:[0075]圖1是本發(fā)明實(shí)施例的嵌入式瀏覽器動(dòng)態(tài)查找和加載組件流程示意圖。以嵌入式瀏覽器作為具體的應(yīng)用程序。當(dāng)前網(wǎng)頁(yè)以其跨平臺(tái)、易部署等特點(diǎn)成為嵌入式系統(tǒng)中的主流門(mén)戶(hù)導(dǎo)航,嵌入式瀏覽器是解析網(wǎng)頁(yè)的核心,在不同業(yè)務(wù)系統(tǒng)中需求不同,需要加載不同組件的功能,比如對(duì)于雙模機(jī)頂盒需要使用DVB組件庫(kù),但互聯(lián)網(wǎng)機(jī)頂盒不需要DVB組件庫(kù)。通過(guò)本發(fā)明實(shí)施例方法,所述嵌入式瀏覽器可以動(dòng)態(tài)發(fā)現(xiàn)和加載本地功能組件,無(wú)須為不同業(yè)務(wù)系統(tǒng)編譯不同版本,并且只在啟動(dòng)相應(yīng)功能時(shí)才加載組件。[0076]本實(shí)例中組件創(chuàng)建實(shí)例的特征接口是調(diào)用的插件標(biāo)準(zhǔn)NPAPI中的NPP_NewO接口函數(shù),撤銷(xiāo)實(shí)例的特征接口是調(diào)用的插件標(biāo)準(zhǔn)NPAPI中的NPP_NewO接口函數(shù)。此外組件的功能接口都是C++類(lèi),因此瀏覽器與組件庫(kù)之間需要定義一個(gè)與組件接口一一對(duì)應(yīng)的基類(lèi),以供加載組件后能得到組件C++實(shí)例對(duì)象并使用其方法。[0077]此外,本實(shí)例的系統(tǒng)可以基于Linux操作系統(tǒng),組件編譯成動(dòng)態(tài)庫(kù)(.so),瀏覽器使用Linux系統(tǒng)函數(shù)dlopen、dlclose、dlsym來(lái)打開(kāi)、關(guān)閉組件庫(kù)以及執(zhí)行組件的接口,具體可以包括以下步驟:[0078]瀏覽器定義一個(gè)基類(lèi),該基類(lèi)中的方法與組件接口一一對(duì)應(yīng);[0079]組件繼承瀏覽器提供的基類(lèi),實(shí)現(xiàn)其派生類(lèi),然后用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝組件庫(kù),編譯成動(dòng)態(tài)庫(kù);[0080]在具備該組件功能的系統(tǒng)中,將組件庫(kù)的路徑加入配置文件;[0081]當(dāng)頁(yè)面解析到需要調(diào)用組件的功能接口后,瀏覽器讀取配置文件中的庫(kù)目錄路徑,在該路徑下遍歷庫(kù),通過(guò)組件特征接口“MMEType”去查找相應(yīng)的組件庫(kù),如果沒(méi)有該接口則返回錯(cuò)誤;[0082]如果有與組件名稱(chēng)對(duì)應(yīng)的組件庫(kù),則調(diào)用Dlopen打開(kāi)該組件對(duì)象對(duì)應(yīng)的組件庫(kù),然后通過(guò)dlsym函數(shù)找到庫(kù)中的NP-1nitializeO函數(shù)用來(lái)調(diào)用,調(diào)用np-1nitializeO函數(shù)后獲得NPP-newO地址,然后調(diào)用NPP-new()創(chuàng)建實(shí)例。[0083]然后通過(guò)方法名稱(chēng)直接調(diào)用組件對(duì)象實(shí)例的方法,以實(shí)現(xiàn)相應(yīng)功能;[0084]當(dāng)離開(kāi)頁(yè)面時(shí),調(diào)用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)NPP_Destroy銷(xiāo)毀組件對(duì)象實(shí)例,然后調(diào)用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)NPP_Shutdown關(guān)閉組件庫(kù)。[0085]為更加清楚地展示本發(fā)明實(shí)施例的方法,圖2展示了本發(fā)明實(shí)施例嵌入式系統(tǒng)組件加載方法示意圖。從圖2可見(jiàn):所述方法包括:應(yīng)用程序或組件在接收到需要調(diào)用標(biāo)準(zhǔn)插件NPAPI封裝的其它組件中的相應(yīng)功能指令時(shí),查找所述其它組件,所述其它組件具有唯一標(biāo)識(shí)其身份的“MIMEType”;查找到所述組件后,將所述組件加載到內(nèi)存中,并獲取創(chuàng)建所述組件實(shí)例的接口以及調(diào)用所述組件的相應(yīng)功能接口;在不需要所述的相應(yīng)功能時(shí),調(diào)用卸載組件接口,將所述其他組件卸載。[0086]優(yōu)選地,所述查找其他組件,具體為:遍歷系統(tǒng)中各組件庫(kù)的特征接口來(lái)查找所述其它組件;加載所述其它組件前,應(yīng)用程序或組件首先會(huì)取得平臺(tái)上存在的所有所述其它組件類(lèi)型,保存所述其它組件的路徑和名稱(chēng),然后在解析網(wǎng)頁(yè)遇到指定插件時(shí),會(huì)去遍歷系統(tǒng)中的各組件庫(kù)的“MMEType”值,找到與指定所述其它組件的“MMEType”值相同的組件庫(kù),進(jìn)而加載正確的所述其它組件。[0087]優(yōu)選地,應(yīng)用程序或組件啟動(dòng)時(shí)不加載所述其它組件。[0088]優(yōu)選地,應(yīng)用程序在編譯階段時(shí)不鏈接所述其它組件。[0089]優(yōu)選地,所述其它組件具有唯一標(biāo)識(shí)其身份的“MMEType”,具體為:不同的所述其它組件擁有不同的“MMEType”類(lèi)型,這是表示所述其它組件本身唯一的標(biāo)識(shí)。應(yīng)用程序或組件就是通過(guò)此類(lèi)型標(biāo)識(shí)來(lái)識(shí)別特定的插件,進(jìn)而調(diào)用所述其它組件的API函數(shù)。[0090]本發(fā)明實(shí)施例所述接口為標(biāo)準(zhǔn)插件的NPAPI接口,在編譯時(shí)不鏈接組件,在應(yīng)用程序啟動(dòng)時(shí)不加載不必要的組件,節(jié)省了內(nèi)存,避免了針對(duì)不同業(yè)務(wù)形態(tài)的嵌入式系統(tǒng)生成不同版本的應(yīng)用程序。[0091]總之,本發(fā)明實(shí)施例提出一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法,針對(duì)嵌入式系統(tǒng)的特點(diǎn),只在具備組件功能的系統(tǒng)中以及在啟動(dòng)組件功能時(shí)發(fā)現(xiàn)并加載組件,編譯時(shí)無(wú)需鏈接組件,從而無(wú)需為不同業(yè)務(wù)形態(tài)系統(tǒng)中是否需要該組件編譯生成不同版本。[0092]最后所應(yīng)說(shuō)明的是,以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非限制,盡管參照較佳實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍?!緳?quán)利要求】1.一種基于插件機(jī)制的動(dòng)態(tài)加載組件方法,所述方法包含:步驟101)封裝組件庫(kù);步驟102)當(dāng)某個(gè)應(yīng)用程序或組件收到需要調(diào)用另一個(gè)組件中具有某種功能的指令時(shí),依據(jù)標(biāo)識(shí)該另一組件身份的“MMEType”,遍歷系統(tǒng)中的各組件庫(kù)的“MMEType”進(jìn)而查找所需組件;步驟103)當(dāng)查找到所需組件后,在內(nèi)存中加載所需組件,并獲取創(chuàng)建所需組件實(shí)例的接口以及調(diào)用所需組件的相應(yīng)功能接口;其中,所有組件均具有唯一一個(gè)標(biāo)識(shí)其身份的“MMEType”。2.根據(jù)權(quán)利要求2所述的基于插件機(jī)制的動(dòng)態(tài)加載組件方法,其特征在于,所述步驟103)之后還包含:調(diào)用卸載組件接口,卸載加載的組件。3.根據(jù)權(quán)利要求1所述的基于插件機(jī)制的動(dòng)態(tài)加載組件方法,其特征在于,采用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝組件庫(kù)。4.根據(jù)權(quán)利要求3所述的基于插件機(jī)制的動(dòng)態(tài)加載組件方法,其特征在于,采用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝組件庫(kù)的方法具體包含如下步驟:在編譯組件庫(kù)的時(shí)候加入npruntime.h、np_entry.cpp、npn_gate.cpp、npp_gate.cpp以及設(shè)置插件調(diào)用接口的def文件;所述npruntime.h為頭文件,所述np_entry.cpp、npn_gate,cpp和npp_gate.cpp為接P函數(shù),且接P函數(shù)np_entry.cpp、npn_gate.cpp和npp_gate,cpp定義在npruntime.h頭文件中;其中,np_entry.cpp中定義了三個(gè)接口,分別是:NP_GetEntryPoints-在插件加載之后立即調(diào)用該接口,用于瀏覽器獲取所有可能需要調(diào)用的API函數(shù)的指針;NP_Initialize-為插件提供全局初始化;NP_Shutdown-為插件提供全局反初始化;npn_gate.cpp文件用于實(shí)現(xiàn)20個(gè)函數(shù)接口,且這些接口是由瀏覽器實(shí)現(xiàn)的;在插件實(shí)例初始化的時(shí)候,將瀏覽器實(shí)現(xiàn)的這些函數(shù)的入口地址保存到一個(gè)NPNetscapeFuncs結(jié)構(gòu)中,這些函數(shù)的實(shí)現(xiàn)就直接根據(jù)NPNetscapeFuncs結(jié)構(gòu)中的入口地址調(diào)用瀏覽器實(shí)現(xiàn)的相關(guān)功能;且在開(kāi)發(fā)插件時(shí)只需要調(diào)用NPN開(kāi)頭的全局函數(shù)即可;npp_gate.cpp文件用于實(shí)現(xiàn)包含如下幾個(gè)函數(shù)接口:NPP_Shutdown():在卸載一個(gè)插件動(dòng)態(tài)鏈接庫(kù)之前及刪除任何插件實(shí)例之后調(diào)用;NPP_New():在創(chuàng)建一個(gè)插件實(shí)例時(shí)調(diào)用,用于初始化插件的實(shí)例數(shù)據(jù)結(jié)構(gòu);NPP_Destroy():在刪除一個(gè)插件實(shí)例時(shí)調(diào)用,用于釋放為插件實(shí)例所分配的空間;NPP_GetMIMEDescript1nO:僅用于Unix環(huán)境,用于獲取由該插件所支持的MME類(lèi)型;其中,Def文件用來(lái)設(shè)置插件供外部調(diào)用的接口,接口一般有三個(gè),分別是NP_GetEntryPoints、NP_Initialize和NP_Shutdown;當(dāng)組件庫(kù)完成封裝之后,如果某個(gè)應(yīng)用程序或組件需要調(diào)用采用插件標(biāo)準(zhǔn)NPAPI接口函數(shù)封裝的組件庫(kù)的時(shí)候,通過(guò)調(diào)用NP_GetEntryPoints、NP_Initialize和NP_Shutdown這三個(gè)接口實(shí)現(xiàn)對(duì)組件庫(kù)方法的調(diào)用。5.根據(jù)權(quán)利要求4所述的基于插件機(jī)制的動(dòng)態(tài)加載組件方法,其特征在于,瀏覽器在組件加載后調(diào)用NP_GetEntryPointS接口,獲取所有可能需要調(diào)用的API函數(shù)的指針,獲取的函數(shù)指針中就包含有NP_Initialize接口函數(shù)指針;然后調(diào)用NP_Initialize接口對(duì)組件進(jìn)行全局初始化,初始化后獲得一系列NPN類(lèi)和NPP類(lèi)函數(shù)接口的指針,獲得的NPP類(lèi)函數(shù)接口的指針中就包含有NPP_GetMIMEDescript1n接口函數(shù)指針;通過(guò)調(diào)用NPP_GetMIMEDescript1n接口函數(shù),就能獲得該組件支持的“MMEType”。6.根據(jù)權(quán)利要求1所述的基于插件機(jī)制的動(dòng)態(tài)加載組件方法,其特征在于,遍歷系統(tǒng)中各組件庫(kù)的特征接口進(jìn)而查找所需組件;組件封裝之后,把封裝好的組件文件放在指定目錄下,當(dāng)解析頁(yè)面遇到需要調(diào)用組件的方法時(shí),加載所需組件;加載所需組件前,應(yīng)用程序或組件首先遍歷系統(tǒng)中的各組件庫(kù)的"MIMEType”來(lái)查找所述組件,找到與指定所需組件的“MMEType”值相同的組件,進(jìn)而加載所需組件。7.根據(jù)權(quán)利要求1所述的基于插件機(jī)制的動(dòng)態(tài)加載組件方法,其特征在于,所述步驟103)進(jìn)一步包含:加載組件時(shí)會(huì)調(diào)用NP_InitializeO進(jìn)行初始化,初始化后獲得一系列NPN類(lèi)和NPP類(lèi)函數(shù)接口的指針,然后調(diào)用NPP_New()函數(shù)接口創(chuàng)建組件實(shí)例并初始化,實(shí)例對(duì)象的構(gòu)造函數(shù)中會(huì)生成ScriptablePluginObject對(duì)象,創(chuàng)建組件實(shí)例后,當(dāng)遇到需要調(diào)用組件中的方法,根據(jù)組件方法的名稱(chēng),去調(diào)用ScriptablePluginObject:HasMethod來(lái)判斷是否有這個(gè)方法,如果有這個(gè)方法,則會(huì)觸發(fā)ScriptablePluginObject::1nvoke函數(shù)運(yùn)行,invoke函數(shù)內(nèi)部根據(jù)方法名稱(chēng)實(shí)現(xiàn)對(duì)應(yīng)的操作。8.一種基于插件機(jī)制的動(dòng)態(tài)加載組件的系統(tǒng),其特征在于,所述系統(tǒng)包含:封裝模塊,用于把組件用插件標(biāo)準(zhǔn)NPAPI接口封裝,實(shí)現(xiàn)像調(diào)用標(biāo)準(zhǔn)插件那樣通過(guò)標(biāo)準(zhǔn)接口去查找組件并調(diào)用組件的方法;查找模塊,用于遍歷存放有多個(gè)組件庫(kù)的目錄,尋找到所需要調(diào)用的組件庫(kù);和調(diào)用模塊,用于查找所需組件庫(kù)后去調(diào)用具體的方法實(shí)現(xiàn)相應(yīng)的功能。【文檔編號(hào)】G06F9/445GK104424002SQ201310409594【公開(kāi)日】2015年3月18日申請(qǐng)日期:2013年9月10日優(yōu)先權(quán)日:2013年9月10日【發(fā)明者】胡琳琳,婁丙允,張武,郭志川申請(qǐng)人:中國(guó)科學(xué)院聲學(xué)研究所,北京中科海力技術(shù)有限公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1