java-Floodlight源码分析IOFMessageListener

时间:2019-05-13 11:07:23下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《java-Floodlight源码分析IOFMessageListener》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《java-Floodlight源码分析IOFMessageListener》。

第一篇: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里,中断和异常都会放入到一个中断描述符表中,都需要特定的处理程序进行处理,并且它们都是异步事件,内核完全不知道何时会有一个异常或者中断发生。当异常或者中断发生时,进程都会陷入内核,在内核中执行相应的处理。异常一般都是由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 游戏演示地址 文件中,搜索“热闹”,并在后面加以下代码

  • 开心农场
  • 5.更新UCH缓存,开始感受完美[QQ版]农场 6.补充说明:

    修改开通牧场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源码

    软件类型:国产软件 授权方式:共享软件 界面语言:简体中文 软件大小:5 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 ”

    language=javascript>location='javascript:history.back(1)'“ 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源码分析IOFMessageListenerword格式文档
    下载java-Floodlight源码分析IOFMessageListener.doc
    将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
    点此处下载文档

    文档为doc格式


    声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至: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源码阅读的真实体会刚才在论坛不经意间,看到有关源码阅读的帖子。回想自己前几年,阅读源码那种兴奋和成就感,不禁又有一种激动。 源码阅读,我觉得最核心有三点:技术基础+......