第一篇:java-Floodlight源碼分析IOFMessageListener
package net.floodlightcontroller.core;
import org.openflow.protocol.OFMessage;
import org.openflow.protocol.OFType;
/**
*
*
* @author
*/
public interface IOFMessageListener extends IListener
/** messages
* @param sw the OpenFlow switch that sent this message
* @param msg the message
* @param* information between listeners
* @return the command to continue or stop the execution
*/
public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx);
}
IOFMessageListener接口繼承了IListener接口,協議類型為
receive方法的返回值使用了IListener中的枚舉類型,且receive方法沒有方法體,在OFMessageFilterManager中可以看到它的實現。
第二篇:《Linux協議棧源碼分析》讀書報告
讀 書 報 告
題目 《Linux協議棧源碼分析》
一、介紹......................................................................................................................................1.1、中斷模型......................................................................................................................-21.1.2、硬中斷...............................................................................................................-2
二、中斷處理..............................................................................................................................2.1、中斷線..........................................................................................................................-32.1.2、特性...................................................................................................................-32.2.1、硬中斷的開關...................................................................................................-42.3、軟中斷處理..................................................................................................................-52.3.2、注冊軟中斷處理函數.......................................................................................-52.4、軟中斷處理和硬中斷處理區別..................................................................................-6
三、中斷處理中數據結構...........................................................................................................3.1、中斷描述符..................................................................................................................-63.3、中斷控制器描述符(PIC、APIC)................................................................................3.4、中斷服務例程(ISR)...................................................................................................四、總結..................................................................................................................................../ 13
二、中斷處理
2.1、中斷線
每個能夠產生中斷的設備或者模塊都會在內核中注冊一個中斷服務例程(ISR),當產生中斷時,中斷處理程序會被執行,在中斷處理程序中,首先會保存中斷向量號和上下文,之后執行中斷線對應的中斷服務例程。對于CPU來說,中斷線是非常寶貴的資源,而由于計算機的發展,外部設備數量和種類越來越多,導致了中斷線資源不足的情況,linux為了應對這種情況,實現了兩種中斷線分配方式,分別是:共享中斷線,中斷線動態分配。2.1.1、中斷線分配方式(1)共享中斷線
多個設備共用一條中斷線,當此條中斷線發生中斷時,因為不可能預先知道哪個特定的設備產生了中斷,因此,這條中斷線上的每個中斷服務例程都會被執行,以驗證是哪個設備產生的中斷(一般的,設備產生中斷時,會標記自己的狀態寄存器,中斷服務例程通過檢查每個設備的狀態寄存器來查找產生中斷的設備),因此共享中斷線的分配方式是比較常見的。(2)中斷線動態分配
一條中斷線在可能使用的時刻才與一個設備驅動程序關聯起來,這樣一來,即使幾個硬件設備并不共享中斷線,同一個中斷向量也可以由這幾個設備在不同時刻運行。2.1.2、特性
(1)中斷處理程序正在運行時,CPU會通知中斷控制器屏蔽產生此中斷的中斷線。此中斷線發出的信號被暫時忽略,當中斷處理程序結束時恢復此中斷線。(2)在中斷服務例程的設計中,原則上是立即處理緊急的操作,將非緊急的操作延后處理(交給軟中斷進行處理)。
(3)中斷處理程序是運行在中斷上下文,但是其是代表進程運行的,因此它所代表的進行必須處于TASK_RUNNING狀態,否則可能出現僵死情況,因此在中斷處理程序中不能執行任何阻塞過程。
/ 13
action=(struct irqaction*)Kmalloc(sizeof(struct irqaction),GFR_ATOMIC);……
此handler就是剛才介紹的handle_IRQ_event 函數中要處理的handler。action->handler=handler;action->flags=irqflags;action->maks-0;action->name=devname;action->next=NULL;action->dev_id=dev_id;retval=setup_irq(irq,action);return retval;}
2.3、軟中斷處理
2.3.1、軟中斷的開關
禁止下半部,如softirq、tasklet和workqueue等: local_bh_disable();local_bh_enable();需要注意的是,禁止下半部時仍然可以被硬中斷搶占。軟中斷由softirq_action結構體表示: struct softirq_action { void(*action)(struct softirq_action *);/* 軟中斷的處理函數 */ };2.3.2、注冊軟中斷處理函數 /** * @nr: 軟中斷的索引號 * @action: 軟中斷的處理函數
*/void open_softirq(int nr, void(*action)(struct softirq_action *)){ softirq_vec[nr].action = action;} 例如:
open_softirq(NET_TX_SOFTIRQ, net_tx_action);open_softirq(NET_RX_SOFTIRQ, net_rx_action);
/ 13
函數,而在do_IRQ()函數中,會根據中斷向量號,從中斷描述符數組中獲取對應的中斷描述符,如下圖: 整個中斷描述符結構如下: struct irq_desc {
struct irq_data irq_data;/* irq的統計信息,在proc中可查到 */ unsigned int __percpu *kstat_irqs;/* 回調函數,當此中斷產生中斷時,會調用handle_irq,在handle_irq中進行遍歷irqaction鏈表
* handle_simple_irq 用于簡單處理;
* handle_level_irq 用于電平觸發中斷的流控處理;
* handle_edge_irq 用于邊沿觸發中斷的流控處理;
* handle_fasteoi_irq 用于需要響應eoi的中斷控制器;
* handle_percpu_irq 用于只在單一cpu響應的中斷;
* handle_nested_irq 用于處理使用線程的嵌套中斷; */irq_flow_handler_t handle_irq;#ifdef CONFIG_IRQ_PREFLOW_FASTEOI irq_preflow_handler_t preflow_handler;#endif
/* 中斷服務例程鏈表 */ struct irqaction *action;
/* IRQ action list *//* 狀態 */ unsigned int status_use_accessors;/* 函數調用中使用,另一個名稱為istate */ unsigned int
core_internal_state__do_not_mess_with_it;/* 嵌套深度,中斷線被激活顯示0,如果為正數,表示被禁止次數 */ unsigned int
depth;
/* nested irq disables */ unsigned int
wake_depth;
/* nested wake enables */ /* 此中斷線上發生的中斷次數 */ unsigned int
irq_count;
/* For detecting broken IRQs */ /* 上次發生未處理中斷時的jiffies值 */ unsigned long
last_unhandled;
/* Aging timer for unhandled count */ /* 中斷線上無法處理的中斷次數,如果當第100000次中斷發生時,有超過99900次是意外中斷,系統會禁止這條中斷線 */ unsigned int
irqs_unhandled;atomic_t
threads_handled;
/ 13
core_internal_state__do_not_mes_with_it成員是用于記錄此中斷線狀態的,中斷線狀態有如下幾種形式:
IRQS_AUTODETECT
/* 該IRQ線用來進行硬件設備探測 */ IRQS_SPURIOUS_DISABLED // 該IRQ線被禁止,是由于產生了欺騙性中斷
IRQS_POLL_INPROGRESS
/* 該IRQ進行輪詢檢查是否發生中斷 */ IRQS_ONESHOT
/* 此IRQ沒有在主處理函數中進行unmasked處理 */ IRQS_REPLAY
/* IRQ線已被禁止,但前一個出現的中斷還沒有被應答 */ IRQS_WAITING
/* 進行硬件設備探測時,會將所有沒有掛載中斷服務程序的IRQ線狀態設置為IRQS_WAITING,如果該IRQ上有中斷產生,就清除這個狀態,可以推斷哪些引腳產生過中斷 */ IRQS_PENDING /* IRQ已經被應答(掛起),但是內核還沒有進行處理 */ IRQS_SUSPENDED
/* 此IRQ被延遲 */
3.2、中斷描述符表和中斷描述符數組
在中斷系統中有兩個名字很相像的結構,就是中斷描述符表和中斷描述符數組。這里我們先說說中斷描述符表。一個系統中的中斷和異常加起來一共是256個,它們以向量的形式保存在中斷描述符表中,每一個向量是8字節(整個表大小就是8 x 256=2048字節),其主要保存著權限位和向量對應的中斷或異常處理程序的入口地址。而一般的,linux會將中斷描述符表中的0~31用于非屏蔽中斷和異常,其他的中斷用于32~255之間。CPU把中斷描述符表的向量類型分為三種類型:任務門、中斷門、陷阱門。CPU為了防止惡意程序訪問中斷,限制了中斷門的權限,而在某些時候,用戶程序又必須使用中斷,所以Linux把中斷描述符的中斷向量類型改為了5種:中斷門,系統門,系統中斷門,陷阱門,任務門。這個中斷描述符表的基地址保存在idtr寄存器中。(1)中斷門
用戶程序不能訪問的CPU中斷門(權限字段為0),所有的中斷處理程序都是這個,被限定在內核態執行。會清除IF標志,屏蔽可屏蔽中斷。
/ 13
信號,將IRQ1的中斷向量號發到數據總線上,此時CPU會通過數據總線讀取IRQ1的中斷向量號。
最后,如果中斷控制器需要EOI(End of Interrupt)信號,CPU則會發送,否則中斷控制器自動將INT拉低,并清除IRQ1對應的中斷請求寄存器位。
在linux內核中,用struct irq_chip結構體描述一個可編程中斷控制器,它的整個結構和調度器中的調度類類似,里面定義了中斷控制器的一些操作,如下: struct irq_chip { /* 中斷控制器的名字 */ const char
*name;/* 控制器初始化函數 */ unsigned int
(*irq_startup)(struct irq_data *data);/* 控制器關閉函數 */ void
(*irq_shutdown)(struct irq_data *data);/* 使能irq操作,通常是直接調用irq_unmask(),通過data參數指明irq */ void
(*irq_enable)(struct irq_data *data);/* 禁止irq操作,通常是直接調用irq_mask,嚴格意義上,他倆其實代表不同的意義,disable表示中斷控制器根本就不響應該irq,而mask時,中斷控制器可能響應該irq,只是不通知CPU */ void
(*irq_disable)(struct irq_data *data);/* 用于CPU對該irq的回應,通常表示cpu希望要清除該irq的pending狀態,準備接受下一個irq請求 */ void(*irq_ack)(struct irq_data *data);/* 屏蔽irq操作,通過data參數表明指定irq */ void
(*irq_mask)(struct irq_data *data);/* 相當于irq_mask()+ irq_ack()*/ void
(*irq_mask_ack)(struct irq_data *data);/* 取消屏蔽指定irq操作 */ void
(*irq_unmask)(struct irq_data *data);/* 某些中斷控制器需要在cpu處理完該irq后發出eoi信號 */ void
(*irq_eoi)(struct irq_data *data);/* 用于設置該irq和cpu之間的親和力,就是通知中斷控制器,該irq發生時,那些cpu有權響應該irq */ int(*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force);
1/ 13
void __percpu
*percpu_dev_id;
/* 鏈表中下一個中斷服務例程 */
struct irqaction
*next;
/* 進行中斷處理的內核線程執行函數 */
irq_handler_t
thread_fn;
/* 一個內核線程,用于執行中斷處理 */
struct task_struct
*thread;
/* IRQ線,IRQ號 */
unsigned int
irq;
unsigned int
flags;
unsigned long
thread_flags;
unsigned long
thread_mask;
const char
*name;
/* 指向/proc/irq/n目錄的描述符 */
struct proc_dir_entry
*dir;} ____cacheline_internodealigned_in_smp;
四、總結
在CPU里,中斷和異常都會放入到一個中斷描述符表中,都需要特定的處理程序進行處理,并且它們都是異步事件,內核完全不知道何時會有一個異?;蛘咧袛喟l生。當異?;蛘咧袛喟l生時,進程都會陷入內核,在內核中執行相應的處理。異常一般都是由CPU內部或者進程產生,而中斷一般都是由外部設備產生。異常處理過程實際上和系統調用沒什么區別(實際上系統調用是通過一個0x80異常陷入內核當中),而中斷的處理過程和情況就相對來說比較復雜。
一個中斷處理分為硬中斷和軟中斷兩個部分,在中斷處理的過程中系統是禁止調度和搶占的,而異常處理過程中是允許的。一個中斷處理程序可以搶占其他的中斷處理程序,也可以搶占異常處理程序,相反的,異常處理程序卻不能夠搶占中斷處理程序。
3-/ 13
第三篇:最新WEB游戲源碼服務端(完整修改版).
2011WEB網頁游戲服務端源碼全集
webgame源碼,本人已測試,供大家下載
一、搶車位源碼
[停車大戰]ASP+ACCESS[帶MSSQL] 版權聲明:(停車大戰V1.0 FOR DVBBS AC)停車大戰V1.0 FOR DVBBS版本,是由NDS.西域數碼(NWDS.CN)于2008年11月開發,作者:SING_CEE 游戲演示地址 文件中,搜索“熱鬧”,并在后面加以下代碼

修改開通牧場VIP等級:打開 happyfarmindex.php 文件 查找 reqYellowlevel 修改 后面的數字
1、修改開通牧場VIP等級:
打開 happyfarmindex.php 文件 查找 reqYellowlevel 修改 后面的數字
2、名稱亂碼:
搜索:happyanimal.php 和 happyfarm.php 里的函數 unicode_encodegb 替換為 unicode_encode
3、作物/動物介紹,說話亂碼:
打開 happyfarmmodulencini.x文明用語,happyfarmmodulemcini.x文明用語 另存為utf-8 編碼格式
4、公告修改
打開 :happyfarm.php 查找:getNotice 下面 找到 : echo “{”id“:”.$_SGLOBAL['timestamp'].“,”content“:”提示:天u6C14轉冷,請多烤火,少上u7F51,少偷菜,愛護好自u5DF1的身體。---農場管理員“,”time“:”.$_SGLOBAL['timestamp'].“,”code“:1}”;使用工具: Unicode中文互轉,進行修改
5、關于注冊 默認VIP等級 在數據庫初始值上修改.暫時未做文本配置.6、關于裝飾反復購買和刷經驗問題 都是假像.由于還沒完成YB購買的代碼 所以未對數據庫操作.刷新就恢復
7、.簡易管理后臺如何使用
http://你的home地址/adminfarm.php 用戶UID:為數字ID 不是帳號
8、一鍵摘取時間段設置 打開 happyfarmindex.php 文件 查找 “batchStealHour” 修改后面的參數.注意 按照格式
9、.home主頁動態提示名稱顯示編碼修復 打開 happyfarm/happyfarm.php 查找 $touserspace[name] = unicode_encodegb($touserspace[name]);刪除此行
10、狗咬人的錢修改 查找:
$dog_money = $cropstype[$a][sale];$int2_temp=rand(1,10);if($int2_temp > 8)上面的8 越小,咬人的幾率越高 往下.......{ $dog_money = $dog_money + round(20 * rand(1,30)/ 5)* rand(1,2);} else { $dog_money = $dog_money + round(10 * rand(1,20)/ 5);rand是取隨機數 round 是四舍五入 根據自己需要進行調節。
可以改rand(1,20)將后面的數字縮小,或者將數字5調大 狗咬人的錢就少了!
點擊下載地址:仿QQ農場牧場(源碼)最新
五、Flash斗地主源碼(網頁斗地主源碼)
網頁版的在線三人斗地主游戲,Flash+PHP5+Mysql5,打開網頁即可直接斗地主,無需下載客戶端!
新增了提示、托管、記分牌、聲音、時鐘、好友邀請等功能。點擊下載地址:Flash斗地主源碼(網頁斗地主源碼)
六、停車大戰V1.0源碼
軟件類型:國產軟件 授權方式:共享軟件 界面語言:簡體中文 軟件大?。? MB 文件類型:.rar 運行環境:Win2003,WinXP,Win2000,Win9X 軟件等級:★★★☆☆ 發布時間:2010-09-18 官方網址:http:// 演示網址:http:// 下載次數:
軟件介紹 <% dim i,page,rscount,pagea page=request.QueryString(“page”)if Request(“action”)=“add” then IF not isNumeric(request.form(“pkmoney”))then response.write “” response.write “” response.end End if IF not isNumeric(request.form(“pktimemoney”))then response.write “” response.write “” response.end End if IF not isNumeric(request.form(“pktype”))then response.write “” response.write “” response.end End if if trim(request.form(“pkname”))=“" then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pkgif“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pkswf“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pktt“))=”“ then response.write ”“ response.write ”“ Response.End end if set rsadd=server.CreateObject(”ADODB.RecordSet“)sqladd=”select * from pk_auto“ rsadd.open sqladd,u_conn,1,3 rsadd.addnew rsadd(”autotype“)=trim(request(”pktype“))rsadd(”autoname“)=trim(request(”pkname“))rsadd(”autobrand“)=trim(request(”pkgif“))rsadd(”autoworth“)=trim(request(”pkmoney“))rsadd(”autott“)=trim(request(”pktt“))rsadd(”swfid“)=trim(request(”pkswf“))rsadd(”autotimemoney“)=trim(request(”pktimemoney“))rsadd.update
rsadd.close response.write ”“ response.write ”“ rs.close set rs=nothing end if if Request(”action“)=”addmoney“ then IF not isNumeric(request.form(”cmemoney“))then response.write ”“ response.write ”“ response.end End if IF not isNumeric(request.form(”userid“))then response.write ”“ response.write ”“ response.end End if musicconn.Execute(”UPDATE [pk_spaces] Set pkumoney = pkumoney +“&request.form(”cmemoney“)&” where pkuid = “&request.form(”userid“))response.write ”“ response.write ”“ end if if Request(”action“)=”editpost“ then IF not isNumeric(request.form(”pkmoney“))then response.write ”“
response.write ”“ response.end End if if not isNumeric(request.form(”pkid“))then response.write ”“ response.write ”“ Response.End end if IF not isNumeric(request.form(”pktimemoney“))then response.write ”“ response.write ”“ response.end End if IF not isNumeric(request.form(”pktype“))then response.write ”“ response.write ”“ response.end End if if trim(request.form(”pkname“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pkgif“))=”“ then response.write ”“ response.write ”“ Response.End
end if if trim(request.form(”pkswf“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pktt“))=”“ then response.write ”“ response.write ”“ Response.End end if if trim(request.form(”pkid“))=”“ then response.write ”“ response.write ”“ Response.End end if set rsadd=server.CreateObject(”ADODB.RecordSet“)sqladd=”select * from pk_auto where autoid=“&trim(request.form(”pkid“))&”“ rsadd.open sqladd,u_conn,1,3 rsadd(”autotype“)=trim(request(”pktype“))rsadd(”autoname“)=trim(request(”pkname“))rsadd(”autobrand“)=trim(request(”pkgif“))rsadd(”autoworth“)=trim(request(”pkmoney“))rsadd(”autott“)=trim(request(”pktt“))rsadd(”swfid“)=trim(request(”pkswf“))rsadd(”autotimemoney“)=trim(request(”pktimemoney“))rsadd.update rsadd.close
set rsadd=nothing response.write ”“ response.write ”“ end if IF Request(”del“)<>”“ Then musicconn.Execute(”Delete From pk_auto Where autoid=“&Request(”del“))response.write ”“ response.write ”“ Response.End End IF dim rspkinfo,pkid,pktype,pkname,pkgif,pkswf,pkmoney,pktimemoney,pktt if Request(”edit“)<>”“ and Request(”edit“)>0 then Set rspkinfo = musicconn.Execute(”Select * From [pk_auto] Where autoid=“&Request(”edit“)&”“)pkid=rspkinfo(”autoid“)pktype=rspkinfo(”autotype“)pkname=rspkinfo(”autoname“)pkgif=rspkinfo(”autobrand“)pkswf=rspkinfo(”swfid“)pkmoney=rspkinfo(”autoworth“)pktimemoney=rspkinfo(”autotimemoney“)pktt=rspkinfo(”autott“)rspkinfo.close set rspkinfo=nothing end if %>
添加車子
第四篇:Android源碼編譯整理總結1.必要的軟件環境 sudo apt-get install build-essential sudo apt-get install make sudo apt-get install gcc sudo apt-get install g++ sudo apt-get install libc6-dev sudo apt-get install patch sudo apt-get install texinfo sudo apt-get install libncurses-dev sudo apt-get install git-core gnupg sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl sudo apt-get install ncurses-dev sudo apt-get install zlib1g-dev sudo apt-get install valgrind sudo apt-get install python2.5 筆者發現這里已經比較全來,不過還有一些應該是linux系統自帶的,如果缺少就按照提示install一下 安裝java環境,這里有必要說一下,大家裝環境的時候很多人會一起裝,不過筆者建議java和其他的分開,因為裝java很可能會失敗,從而導致其他的也fail sudo apt-get install sun-java6-jdk 這里就說到上面說很多人會安裝java失敗的問題,筆者也是從網上找的解決辦法現在一起整理出來: ubuntu10.04 lucid 去掉了sun-java6-jre,sun-java6-jdk的源,所以如果是直接apt-get install 提示是 現在沒有可用的軟件包 sun-java6-jdk,但是它被其它的軟件包引用了。 這可能意味著這個缺失的軟件包可能已被廢棄,或者只能在其他發布源中找到 E: 軟件包 sun-java6-jdk 還沒有可供安裝的候選者 解決辦法(選擇一個即可): 1、系統->系統管理->軟件源->“其它軟件”下添加一個 deb http://archive.canonical.com/ lucid partner 之后,再執行apt-get install 如果是下載java5就添加deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse” 2、自己從sun網站下載相應的Jre,JDK安裝即可 3、從新立德軟件管理器中search openJDK,用openJDK代替 注: 官方文檔說如果用sun-java6-jdk可出問題,得要用sun-java5-jdk。經測試發現,如果僅僅make(make不包括make sdk),用sun-java6-jdk是沒有問題的。而make sdk,就會有問題,嚴格來說是在make doc出問題,它需要的javadoc版本為1.5。 因此,我們安裝完sun-java6-jdk后最好再安裝sun-java5-jdk,或者 只安裝sun-java5-jdk。這里sun-java6-jdk和sun-java5-jdk都安裝,并只修改javadoc.1.gz和 javadoc。因為只有這兩個是make sdk用到的。這樣的話,除了javadoc工具是用1.5版本,其它均用1.6版本: sudo apt-get install sun-java5-jdk 修改javadoc的link cd /etc/alternatives sudo rm javadoc.1.gz sudo ln-s /usr/lib/jvm/java-1.5.0-sun/man/man1/javadoc.1.gz javadoc.1.gz sudo rm javadoc sudo ln-s /usr/lib/jvm/java-1.5.0-sun/bin/javadoc javadoc 2、設置環境變量 vim ~/.bashrc 在.bashrc中新增或整合PATH變量,如下 #java 程序開發/運行的一些環境變量 JAVA_HOME=/usr/lib/jvm/java-6-sun JRE_HOME=${JAVA_HOME}/jre export ANDROID_JAVA_HOME=$JAVA_HOME export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSP ATH export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin export JAVA_HOME;export JRE_HOME;export CLASSPATH;HOME_BIN=~/bin/ export PATH=${PATH}:${JAVA_PATH}:${JRE_PATH}:${HOME_BIN};#echo $PATH;最后,同步這些變化: source ~/.bashr 3.安裝repo(用來更新android源碼) 創建~/bin目錄,用來存放repo程序,如下: $ cd ~ $ mkdir bin 并加到環境變量PATH中,在第2步中已經加入 下載repo腳本并使其可執行: $ curl http://android.git.kernel.org/repo >~/bin/repo $ chmod a+x ~/bin/repo 4.初始化repo repo是android對git的一個封裝,簡化了一些git的操作。創建工程目錄: $ mkdir android $ cd android repo初始化 $ repo init-u git://android.git.kernel.org/platform/manifest.git 這里包含了android最新的源碼 在此過程中需要輸入名字和email地址。初始化成功后,會顯示: repo initialized in /android 在~/android下會有一個.repo的隱藏目錄。 如果想拿某個branch而不是主線上的代碼,我們需要用-b參數制定branch名字,比如: repo init-u git://android.git.kernel.org/platform/manifest.git-b cupcake 這 里抓下來的分支是cupcake,網上關于編譯到文章大多是針對cupcake分支,是andoird 1.5版本,但是之前我沒有輸入后面的參數,以致于下到的代碼是主線上的代碼,是android 2.1版本。兩者目錄結構有一些差別,導致當我按照網上的說明步驟來執行遇到錯誤時,不知道是版本不同的原因還是其他什么原因。因此很奇怪為什么網上的文 章都是說cupcake的,而沒有怎么講主線的源代碼編譯。5.同步源代碼 $ repo sync 這一步要很久,要看個人的網絡速度 6.編譯android源碼,并得到~/android/out目錄 $ cd ~/andoird $ make-j2 筆者的電腦是雙核所以是-j2,以此類推8核就可以-j8 這一過程很久,主要看機器的配置 如果是cupcake,那么直接make的時候,會出現以下錯誤: 1.frameworks/policies/base/PolicyConfig.mk:22: *** No module defined for the given PRODUCT_POLICY(android.policy_phone).Stop.錯誤。 解決辦法: 在build/tools/findleaves.sh中的第89行,這一句find “${@:0:$nargs}” $findargs-type f-name “$filename”-print | 改為find “${@:1:$nargs-1}” $findargs-type f-name “$filename”-print | 2.frameworks/base/tools/aidl/AST.cpp:10: error: 'fprintf' was not declared in this scope的錯誤 解決辦法: 下載gcc-4.3和g++-4.3 apt-get install gcc-4.3 g++-4.3 因為ubuntu 9.10自帶到是gcc 4.4,因此需要重新下載gcc 4.3,最后設置gcc軟連接到gcc 4.3 進入/usr/bin cd /usr/bin 建個軟連接 ln-s gcc-4.3 gcc ln-s g++-4.3 g++ 然后進入android目錄下,執行make,就可以了。 主線代碼則沒有此問題 7.在模擬器上運行編譯好的android 編譯好android之后,emulator在~/android/out/host/linux-x86/bin 下,ramdisk.img,system.img和userdata.img則在~/android/out/target/product /generic下 $ cd ~/android/out/host/linux-x86/bin 增加環境變量 $ emacs ~/.bashrc 在.bashrc中新增環境變量,如下 #java 程序開發/運行的一些環境變量 export ANDROID_PRODUCT_OUT=~/android/out/target/product/g eneric ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x 86/bin export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_ PRODUCT_OUT};最后,同步這些變化: $ source ~/.bashrc $ cd ~/android/out/target/product/generic $ emulator-system system.img-data userdata.img-ramdisk ramdisk.img 最后進入android桌面,就說明成功了。8.編譯模塊 android中的一個應用程序可以單獨編譯,編譯后要重新生成system.img 在源碼目錄下執行 $.build/envsetup.sh(.后面有空格)就多出一些命令: -croot: Changes directory to the top of the tree.mm: Builds all of the modules in the current directory.cgrep: Greps on all local C/C++ files.resgrep: Greps on all local res/*.xml files.-godir: Go to the directory containing a file.可以加—help查看用法 我們可以使用mmm來編譯指定目錄的模塊,如編譯聯系人: $ mmm packages/apps/Contacts/ 編完之后生成兩個文件: out/target/product/generic/data/app/ContactsTests.apk out/target/product/generic/system/app/Contacts.apk 可以使用 $ make snod 重新生成system.img,再運行模擬器 9.編譯SDK 直接執行make是不包括make sdk的。make sdk用來生成SDK,這樣,我們就可以用與源碼同步的SDK來開發android了。 a)修改/frameworks/base/include/utils/Asset.h ?UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024? 改為 ?UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024? 原因是eclipse編譯工程需要大于1.3M的buffer; 這一步,筆者編譯的是主線程的,在Asset.h文件里沒找到上面的常量,所以就沒做這一步,但是也成功了。b)編譯ADT。 如果想用eclipse開發android應用程序,最好是安裝ADT,這樣就可以在eclipse下創建android的工程。 產生ADT eclipse plugins $ development/tools/eclipse/scripts/build_server.sh ~/adt/ 使用前建議設定一下ECLIPSE_HOME的環境變量,不然會以為沒有裝eclipse,然后幫你download下來。 這里要非常注意,本人就曾經卡在這里,始終編譯不過。一開始會提示eclipse的什么什么jar找不到,因此fail。這主要是因為我到 ECLIPSE_HOME到環境變量設置錯誤。我之前裝的eclipse只從新力得上面抓下來的,好像找不到eclipse所在到目錄是哪個,結果就設置 了一個名為eclipse的文件夾作為環境變量。因此后來直接從eclipse的官網上下了一個,以為這樣就可以。結果杯具的是下到是一個eclipse Galileo,到頭來還是提示eclipse什么什么文件找不到。最后實在沒法,索性把eclipse刪個干凈,讓程序自己去下eclipse,發現抓 的是eclipse ganymede。在此要鄭重說明一下,自己去下的話應該下載jee的ganymade,而不能是java 的ganymade,具體原因試試就知道了。 主線代碼編譯ADT的時候方法相同,但是沒有development/tools/eclipse這個目錄,而是在/sdk/eclipse這個目錄 c)執行make sdk。 注意,這里需要的javadoc版本為1.5,所以你需要在步驟1中同時安裝sun-java5-jdk $ make sdk 編譯很慢。編譯后生成的SDK存放在out/host/linux-x86/sdk/,此目錄下有android-sdk_eng.xxx_linux-x86.zip和android-sdk_eng.xxx_linux-x86目錄。android-sdk_eng.xxx_linux-x86就是 SDK目錄 實際上,當用mmm命令編譯模塊時,一樣會把SDK的輸出文件清除,因此,最好把android-sdk_eng.xxx_linux-x86移出來 此后的應用開發,就在該SDK上進行,所以把7)對于~/.bashrc的修改注釋掉,增加如下一行: export PATH=${PATH}:~/android/out/host/linux-x86/sdk/andr oid-sdk_eng.xxx_linux-x86/tools 注意要把xxx換成真實的路徑; 同樣筆者編譯的是主線程,所以編譯完之后,發現~/android/out/host/linux-x86/sdk/android-sdk_eng.x xx_linux-x86/目錄下有2個文件夾一個是tools一個是platform-tools,然后用eclipse指向這個目錄的時候會提示找不到ADB,這時候只要把platform-tools下的ADB拷貝到tools文件夾就OK了 d)關于環境變量、android工具的選擇 目前的android工具有: A、我們從網上下載的SDK,如果你下載過的話(tools下有許多android工具,lib/images下有img映像) B、我們用make sdk編譯出來的SDK(tools下也有許多android工具,lib/images下有img映像) C、我們用make編譯出來的out目錄(tools下也有許多android工具,lib/images下有img映像) 那么我們應該用那些工具和img呢? 首先,我們一般不會用A選項的工具和img,因為一般來說它比較舊,也源碼不同步。其次,也不會用C選項的工具和img,因為這些工具和img沒有經過 SDK的歸類處理,會有工具和配置找不到的情況;事實上,make sdk產生的很多工具和img,在make編譯出來out目錄的時候,已經編譯產生了,make sdk只是做了copy而已。e)安裝、配置ADT ~/adt/android-eclipse/下的文件壓縮,然后從eclipse中install就行了,當然還有其他方法 10.編譯linux內核映像 a)準備交叉編譯工具鏈 android代碼樹中有一個prebuilt項目,包含了我們編譯內核所需的交叉編譯工具。b)設定環境變量 $ emacs ~/.bashrc 增加如下兩行: export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/ arm-eabi-4.4.0/bin export ARCH=arm 保存后,同步變化: $ source ~/.bashrc c)獲得合適的內核源代碼 $ cd ~/android 獲得內核源代碼倉庫 $ git clone git://android.git.kernel.org/kernel/common.git kernel $ cd kernel $ git branch 顯示 * android-2.6.27 說明你現在在android-2.6.27這個分支上,也是kernel/common.git的默認主分支。顯示所有head分支: $ git branch-a 顯示 * android-2.6.27 remotes/origin/HEAD-> origin/android-2.6.27 remotes/origin/android-2.6.25 remotes/origin/android-2.6.27 remotes/origin/android-2.6.29 remotes/origin/android-goldfish-2.6.27 remotes/origin/android-goldfish-2.6.29 我們選取最新的android-goldfish-2.6.29,其中goldfish是android的模擬器模擬的CPU。 $ git checkout-b android-goldfish-2.6.29 origin/android-goldfish-2.6.29 $ git branch 顯示 android-2.6.27 * android-goldfish-2.6.29 我們已經工作在android-goldfish-2.6.29分支上了。d)設定交叉編譯參數 打開kernel目錄下的Makefile文件,把CROSS_COMPILE指向剛才下載的prebuilt中的arm-eabi編譯器 CROSS_COMPILE ?= arm-eabi-把 LDFLAGS_BUILD_ID = $(patsubst-Wl$(comma)%,%, $(call ld-option,-Wl$(comma)build-id,)) 這一行注釋掉,并且添加一個空的LDFLAGS_BUILD_ID定義,如下: LDFLAGS_BUILD_ID = e)編譯內核映像 $ cd ~/android/kernel $ make goldfish_defconfig $ make f)測試生成的內核映像 $ emulator-avd myavd-kernel ~/android/kernel/arch/arm/boot/zImage 第五篇:VB 源碼 字符排列組合(范文)效果圖 編程界面 所有源碼 Option Explicit Private newStr As String, tempNewStr As String, cont As Long Private Sub Command1_Click() Text1.Enabled = False RichTextBox1.Enabled = False RichTextBox1.Text = “" Dim tempStr As String tempStr = Trim(Text1.Text) newStr = ”“: tempNewStr = ”“ cont = 0 If Check1.Value = 0 Then GetStr tempStr If Check1.Value = 1 Then GetStr2 tempStr, ”“ RichTextBox1.Text = newStr Frame1.Caption = ”總個數:“ & cont Text1.Enabled = True RichTextBox1.Enabled = True RichTextBox1.Find End Sub Private Sub Text1_Change() RichTextBox1.Text = ”“ Frame1.Caption = ”總個數:“ End Sub Private Function GetStr(ByVal str1 As String)As String str1 = Trim(str1) If str1 = ”“ Then Exit Function Dim i As Integer, tempStr As String, tempChr As String, tempLen As Integer Dim mytempStr As String mytempStr = tempNewStr For i = 1 To Len(str1) DoEvents tempChr = ”“ tempChr = Mid(str1, i, 1)'取一個字符 tempNewStr = tempNewStr & tempChr '單組組合tempStr = Left(str1, ii)'剩余新字符 If Len(tempStr)> 1 Then GetStr tempStr Else newStr = newStr & tempNewStr & tempStr & IIf((cont + 1)Mod 200 = 0, Chr(13), Chr(9))'終組組合 cont = cont + 1 Frame1.Caption = ”執行中:“ & cont End If tempNewStr = mytempStr Next End Function Private Function GetStr2(ByVal str1 As String, ByVal str2 As String)As String Dim tempStr As String Dim i As Integer For i = 1 To Len(str1) DoEvents If Len(str2)+ 1 = Len(str1)Then newStr = newStr & str2 & Mid(str1, i, 1)& IIf((cont + 1)Mod 200 = 0, Chr(13), Chr(9)) cont = cont + 1 Frame1.Caption = ”執行中:" & cont Else GetStr2 str1, str2 & Mid(str1, i, 1) End If Next End Function ![]() 下載java-Floodlight源碼分析IOFMessageListener.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
![]() 點此處下載文檔
文檔為doc格式 網址:http://www.tmdps.cn/a8/2019051311/3ab0e356c10f33b8.html
聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。 源碼交易平臺簡介(共5篇)人文街交易平臺成立于2014年10月18日,屬于源碼素材教程共享平臺網站,主要內容有:,PS素材,設計素材,視頻教程,視頻素材,APP交易平臺,軟件交易等。目前已成為全國最專業、素材更...... android有關sensor的源碼總結android有關sensor的源碼總結 雖然這篇文章寫得很差,因為趕時間,所以就匆匆忙忙地寫出來自己作一個筆記。但是我想對大家應該有一點幫助。 1、有關sensor在Java應用程序的編...... 軟件源碼移交保密協議系統源碼授權使用保密協議 ╳╳系統 源碼授權使用保密協議 甲方:珠海市聯進高技術有限公司乙方: 簽訂地點: 一、協議背景 ╳╳系統是珠海市聯進高技術有限公司(以下簡稱甲方)...... Ubuntu 11.10編譯Android源碼錯誤[范文大全]Ubuntu 11.10編譯Android源碼錯誤 問題1: frameworks/base/libs/utils/RefBase.cpp: 在成員函數 ‘void android::RefBase::weakref_type::trackMe(bool, bool)’中: framewo...... ASP學生信息管理系統論文+源碼ASP學生信息管理系統論文+源碼222.240.89.* 1樓 1緒論 1 1.1 國內外應用與開發現狀 1 1.1.1 應用現狀 1 1.1.2 系統開發現狀 1 1.2 教師專用學生信息管理系統開發背景及目標...... 大型ASP網站源碼運行說明書大型ASP網站源碼運行說明 大型ASP網站源碼運行說明 1.1 辦公自動化網站運行說明 辦公自動化網站屬于網絡辦公類,工作人員可以通過使用該系統進行人事管理、工作計劃管理和...... QQ空間魔力日志制作源碼教程范文合集QQ空間魔力日志制作源碼教程 魔力日志制作教程 有一種“魔力”的QQ空間日志,當你進入自己QQ個人中心時看到別人空間轉發了這篇日志的時候,會在上看到你的QQ號,網名、頭像、...... Java源碼閱讀的真實體會(五篇模版)Java源碼閱讀的真實體會剛才在論壇不經意間,看到有關源碼閱讀的帖子?;叵胱约呵皫啄?,閱讀源碼那種興奮和成就感,不禁又有一種激動。 源碼閱讀,我覺得最核心有三點:技術基礎+...... |