重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
实现一个binder通信实例,需要经过以下步骤: (一)获得ServiceManager的对象引用 (二)向ServiceManager注册新的Service (三)在Client中通过ServiceManager获得Service对象引用 (三)在Client中发送请求,由Service返回结果。 下面看具体的代码如何实现。 三.一 libmyservice代码实现 (一)新建目录frameworks/base/myservice/libservice,进入该目录 view plain $ cd frameworks/base $ mkdir myservice $ cd myservice $ mkdir libmyservice $ cd libmyservice (二)编写libmyservice/myservic.h文件 view plain #include threads.h #include RefBase.h #include IInterface.h #include BpBinder.h #include Parcel.h namespace android { class MyService : public BBinder { mutable Mutex mLock; int三二_t mNextConnId; public: static int instantiate(); MyService(); virtual ~MyService(); virtual status_t onTransact(uint三二_t, const Parcel, Parcel*, uint三二_t); }; }; //namespace (二)编写libservice/myservice.cpp文件 view plain #include "myservice.h" #include IServiceManager.h #include IPCThreadState.h namespace android { static struct sigaction oldact; static pthread_key_t sigbuskey; int MyService::instantiate() { LOGE("MyService instantiate"); // defaultServiceManager ()获得ServiceManager的对象引用,addService()可向ServiceManager注册新的服务 int r = defaultServiceManager()-addService(String一陆("android.myservice"), new MyService()); LOGE("MyService r = %d/n", r); return r; } MyService::MyService() { LOGV("MyService created"); mNextConnId = 一; pthread_key_create(sigbuskey, NULL); } MyService::~MyService() { pthread_key_delete(sigbuskey); LOGV("MyService destroyed"); } // 每个系统服务都继承自BBinder类,都应重写BBinder的onTransact虚函数。当用户发送请求到达Service时,系统框架会调用Service的onTransact函数,该函数分析接收到的数据包,调用相应的接口函数处理请求 status_t MyService::onTransact(uint三二_t code, const Parcel data, Parcel* reply, uint三二_t flags) { switch(code) { case 0: { pid_t pid = data.readInt三二(); int num = data.readInt三二(); num = num + 一00; reply-writeInt三二(num); return NO_ERROR; } break; default: return BBinder::onTransact(code, data, reply, flags); } } }; //namespace (三)编写libservice/Android.mk文件 view plain # File: Android.mk LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := myservice.cpp LOCAL_C_INCLUDES := $(JNI_H_INCLUDE) LOCAL_SHARED_LIBRARIES := libutils libbinder LOCAL_MODULE_TAGS := optional LOCAL_PRELINK_MODULE := false LOCAL_MODULE := libmyservice include $(BUILD_SHARED_LIBRARY) (四)编译libmyservice.so动态库 在android源码主目录下 view plain $ source build/envsetup.sh including device/htc/passion/vendorsetup.sh including device/samsung/crespo四g/vendorsetup.sh including device/samsung/crespo/vendorsetup.sh $ mmm frameworks/base/myservice/libmyservice/ 编译成功后生成文件:out/target/product/generic/system/lib/libmyservice.s
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:国际域名空间、虚拟空间、营销软件、网站建设、萨迦网站维护、网站推广。
C++ int i[233];直接这样写代表了,定义了一个整形的数组,共有233个整形元素,数组的名字叫做i。
在进行新纪元时间(1970-01-01 00:00:00)以来的秒到实际时间之间转换的时候 MySQL 根据参数 time_zone 的设置有两种选择:
time_zone 设置为 SYSTEM 的话:使用 sys_time_zone 获取的 OS 会话时区,同时使用 OS API 进行转换。对应转换函数 Time_zone_system::gmt_sec_to_TIME
time_zone 设置为实际的时区的话:比如 ‘+08:00’,那么使用使用 MySQL 自己的方法进行转换。对应转换函数 Time_zone_offset::gmt_sec_to_TIME
实际上 Time_zone_system 和 Time_zone_offset 均继承于 Time_zone 类,并且实现了 Time_zone 类的虚函数进行了重写,因此上层调用都是 Time_zone::gmt_sec_to_TIME。
需要强调的一点是, 语言只是工具, 在特定应用场景下满足特定需要的工具,
脱离应用场景来谈不但没有意义而且还会扣友善度。以下经验(吐槽)都是针对大规模科学计算的, 个人电脑写一个下午的代码,然后跑十分钟的代码趁早去用
Python/R/Matlab/Ruby, 上手容易, 功能强大, 网上资源丰富, 绝对是您无悔的选择。
大家的难用都是从
fortran77那里感受来的,看过80年代的Fortran77代码,混乱程度简直爆表。再看2000年左右的Fortran95代码,马马虎虎,
算是中规中矩的结构化语言。最近看过2010年左右的Fortran2003 code(Fortran的lua接口)
。抽象类,构造函数满天飞,我擦好多feature都不知道。
所以你们批判的不是Fortran, 而是任性的,非结构化的coding
style。这不过恰巧搞科学的这票人都不太鸟coding standard和coding style,
所以Fortran写出来的代码大都比较乱, 这是使用者自身需要学习一个, 跟语言本身关系不大吧。见过师弟师妹们写的C代码,
比Fortran版本的还魔幻。
而C和C++里面也有goto, 也有extern可以不做函数参数参数检查,倒是没见你们怎么喷。Fortran里面也有interface来声明函数原型, 倒也没见你们怎么用。
比
如elemental, pure, 函数重载, forall, where,
Fortran95新加的功能一大部分是为并行度设计的,其语法也非常偏向高维的大数组操作, 自动并行化(openmp
workshare)用起来简直比C++爽不知道多少倍。在OpenMP+MPI的场合加上千核量级的并行度,还是有优势的。还有一种东西叫CAF,
CoArray Fortran, 专门针对大并行度的超级计算机添加了很多新语法,估计知道的人不多。
更不要说Fortran2003/2008支持面向对象。当然在虚函数方面好像比C++缺了一个功能, 其他都是完整复刻的。
class A
{
public:
virtual void foo() //用virtual声明的函数就叫虚函数
{
cout "A::foo() is called" endl;
}
};