Java虛擬機(jī)相當(dāng)于一個(gè)堆棧計(jì)算機(jī),它在指令間傳送信息時(shí)不使用任何物理寄存器,而使用堆棧的幀來(lái)表示方法的狀態(tài)、字節(jié)碼的操作對(duì)象、方法的參數(shù)空間及局部變量的空間,它的“程序計(jì)數(shù)器”為一個(gè)偽寄存器,是當(dāng)前所執(zhí)行指令的字節(jié)碼數(shù)組的一個(gè)指針。
Java實(shí)現(xiàn)方法
Java有兩種實(shí)現(xiàn)方法:Java方法和本地方法。Java方法是由Java語(yǔ)言編寫,編譯成字節(jié)碼,存儲(chǔ)在class文件中。本地方法是由其他語(yǔ)言(比如C,C++,或者匯編語(yǔ)言)編寫的,編譯成和處理器相關(guān)的機(jī)器代碼,保存在動(dòng)態(tài)連接庫(kù)中,格式是各個(gè)平臺(tái)專有的,它是聯(lián)系Java程序和底層主機(jī)操作系統(tǒng)的連接方法。Java方法與平臺(tái)無(wú)關(guān),但是本地方法卻不是,運(yùn)行中的Java程序調(diào)用本地方法時(shí),虛擬機(jī)裝載包含這個(gè)本地方法的動(dòng)態(tài)庫(kù),并調(diào)用這個(gè)方法。通過(guò)本地方法,Java程序可以直接訪問底層操作系統(tǒng)的資源,使程序和特定的平臺(tái)相關(guān),一個(gè)本地方法接口——Java本地接口(JNI)使得本地方法可以在特定的主機(jī)系統(tǒng)的任何一個(gè)Java平臺(tái)上運(yùn)行。
J2ME中的CDC移植的解決方案
我們選用的要移植的Java虛擬機(jī)是Sun公司提供的J2ME對(duì)于數(shù)字電視領(lǐng)域CDC配置,該虛擬機(jī)是針對(duì)Linux的軟件實(shí)現(xiàn)(用C語(yǔ)言編寫的虛擬機(jī),該虛擬機(jī)也稱為CVirtualMachine,簡(jiǎn)稱CVM)。Java虛擬機(jī)規(guī)范并沒有強(qiáng)求Java虛擬機(jī)必須支持任何特定的本地方法接口,但是Sun公司提供了本地方法接口(JavaNativeInterface),是為移植所用。Java程序通過(guò)調(diào)用本地方法和主機(jī)交互。
Java虛擬機(jī)
圖2Java虛擬機(jī)的位置
虛擬機(jī)處于嵌入式操作系統(tǒng)OS20上,因此Sun公司提供的Java虛擬機(jī)中與底層操作系統(tǒng)相關(guān)的操作都應(yīng)該替換為OS20的內(nèi)核函數(shù)。因此將Sun公司提供的CDC移植到OS20需要完成一些工作,比如:C語(yǔ)言中關(guān)于基本數(shù)據(jù)類型的數(shù)據(jù)位的修改,關(guān)于線程的創(chuàng)建機(jī)制(OS20為任務(wù)),關(guān)于線程之間的同步、互斥,關(guān)于動(dòng)態(tài)連接的實(shí)現(xiàn),關(guān)于本地方法的實(shí)現(xiàn)等,本節(jié)主要介紹關(guān)于本地方法的實(shí)現(xiàn)過(guò)程。