重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
實(shí)現(xiàn)一個binder通信實(shí)例,需要經(jīng)過以下步驟: (一)獲得ServiceManager的對象引用 (二)向ServiceManager注冊新的Service (三)在Client中通過ServiceManager獲得Service對象引用 (三)在Client中發(fā)送請求,由Service返回結(jié)果。 下面看具體的代碼如何實(shí)現(xiàn)。 三.一 libmyservice代碼實(shí)現(xiàn) (一)新建目錄frameworks/base/myservice/libservice,進(jìn)入該目錄 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注冊新的服務(wù) 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"); } // 每個系統(tǒng)服務(wù)都繼承自BBinder類,都應(yīng)重寫B(tài)Binder的onTransact虛函數(shù)。當(dāng)用戶發(fā)送請求到達(dá)Service時,系統(tǒng)框架會調(diào)用Service的onTransact函數(shù),該函數(shù)分析接收到的數(shù)據(jù)包,調(diào)用相應(yīng)的接口函數(shù)處理請求 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動態(tài)庫 在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
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供諸城網(wǎng)站建設(shè)、諸城做網(wǎng)站、諸城網(wǎng)站設(shè)計(jì)、諸城網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、諸城企業(yè)網(wǎng)站模板建站服務(wù),10年諸城做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
接口(python 中的協(xié)議)的多種不同的實(shí)現(xiàn)方式即為多態(tài)。多態(tài)的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實(shí)例的某一屬性時的正確調(diào)用。
可以看到,在上面的代碼中,只要實(shí)現(xiàn)了 Dock 類中的 swimming 和 Walk 方法,那么這個類就可以被叫做 Dock 類
應(yīng)用場景 如: for 循環(huán), 在python 中 for 循環(huán)只能用于可迭代對象, 那么, 我自己定義的類實(shí)現(xiàn)了 __iter__協(xié)議(接口),這個實(shí)例類就是一個可迭代對象,可以被for 循環(huán)使用
python 中定義協(xié)議類協(xié)議使用 @abstractmethod 裝飾器,@abstractmethod 裝飾過的類是不能進(jìn)行初始化的,相對于c++中的純虛函數(shù)類
這個類只能當(dāng)做協(xié)議(接口)類
需要強(qiáng)調(diào)的一點(diǎn)是, 語言只是工具, 在特定應(yīng)用場景下滿足特定需要的工具,
脫離應(yīng)用場景來談不但沒有意義而且還會扣友善度。以下經(jīng)驗(yàn)(吐槽)都是針對大規(guī)模科學(xué)計(jì)算的, 個人電腦寫一個下午的代碼,然后跑十分鐘的代碼趁早去用
Python/R/Matlab/Ruby, 上手容易, 功能強(qiáng)大, 網(wǎng)上資源豐富, 絕對是您無悔的選擇。
大家的難用都是從
fortran77那里感受來的,看過80年代的Fortran77代碼,混亂程度簡直爆表。再看2000年左右的Fortran95代碼,馬馬虎虎,
算是中規(guī)中矩的結(jié)構(gòu)化語言。最近看過2010年左右的Fortran2003 code(Fortran的lua接口)
。抽象類,構(gòu)造函數(shù)滿天飛,我擦好多feature都不知道。
所以你們批判的不是Fortran, 而是任性的,非結(jié)構(gòu)化的coding
style。這不過恰巧搞科學(xué)的這票人都不太鳥coding standard和coding style,
所以Fortran寫出來的代碼大都比較亂, 這是使用者自身需要學(xué)習(xí)一個, 跟語言本身關(guān)系不大吧。見過師弟師妹們寫的C代碼,
比Fortran版本的還魔幻。
而C和C++里面也有g(shù)oto, 也有extern可以不做函數(shù)參數(shù)參數(shù)檢查,倒是沒見你們怎么噴。Fortran里面也有interface來聲明函數(shù)原型, 倒也沒見你們怎么用。
比
如elemental, pure, 函數(shù)重載, forall, where,
Fortran95新加的功能一大部分是為并行度設(shè)計(jì)的,其語法也非常偏向高維的大數(shù)組操作, 自動并行化(openmp
workshare)用起來簡直比C++爽不知道多少倍。在OpenMP+MPI的場合加上千核量級的并行度,還是有優(yōu)勢的。還有一種東西叫CAF,
CoArray Fortran, 專門針對大并行度的超級計(jì)算機(jī)添加了很多新語法,估計(jì)知道的人不多。
更不要說Fortran2003/2008支持面向?qū)ο蟆.?dāng)然在虛函數(shù)方面好像比C++缺了一個功能, 其他都是完整復(fù)刻的。
在進(jìn)行新紀(jì)元時間(1970-01-01 00:00:00)以來的秒到實(shí)際時間之間轉(zhuǎn)換的時候 MySQL 根據(jù)參數(shù) time_zone 的設(shè)置有兩種選擇:
time_zone?設(shè)置為 SYSTEM 的話:使用 sys_time_zone 獲取的 OS 會話時區(qū),同時使用 OS API 進(jìn)行轉(zhuǎn)換。對應(yīng)轉(zhuǎn)換函數(shù) Time_zone_system::gmt_sec_to_TIME
time_zone?設(shè)置為實(shí)際的時區(qū)的話:比如 ‘+08:00’,那么使用使用 MySQL 自己的方法進(jìn)行轉(zhuǎn)換。對應(yīng)轉(zhuǎn)換函數(shù) Time_zone_offset::gmt_sec_to_TIME
實(shí)際上 Time_zone_system 和 Time_zone_offset 均繼承于 Time_zone 類,并且實(shí)現(xiàn)了 Time_zone 類的虛函數(shù)進(jìn)行了重寫,因此上層調(diào)用都是 Time_zone::gmt_sec_to_TIME。
個人覺得是先學(xué)c,再python,最后c++
首先c語法簡單,但是因?yàn)榻咏讓樱阅銜幊痰暮枚啾举|(zhì)有所了解,比如內(nèi)存的本質(zhì),程序運(yùn)行的本質(zhì),指針強(qiáng)準(zhǔn)的本質(zhì),關(guān)鍵是這些都不難,多用一用就能理解。但是c也只適合入門了,因?yàn)樗_發(fā)效率偏低,解決問題時,花費(fèi)時間長,也就是開發(fā)效率低(當(dāng)然執(zhí)行效率高)。
因?yàn)閏的運(yùn)行效率高,經(jīng)常會被用作開發(fā)操作系統(tǒng),而且操作系統(tǒng)也不需要c++那樣花哨的語言特性。當(dāng)然,一般人不會接觸到操作系統(tǒng)的開發(fā)……
python就是一個瑞士軍刀,好像什么都能做。但是你要擰螺絲的話,是瑞士軍刀的好還是獨(dú)立螺絲刀好?肯定是獨(dú)立螺絲刀好用!但是有了瑞士軍刀,擰螺絲這個事又不是很急,何必非買獨(dú)立螺絲刀呢?而且瑞士軍刀用起來可能有些不方便,但是肯定比出門買個獨(dú)立螺絲刀要方便啊!這就是python的最大優(yōu)勢,他有非常齊全的庫,官方的也好第三方也好,經(jīng)過十幾年的積累,這是一個龐大的集群。因?yàn)閜ython語法簡單,甚至接近偽代碼,所以python對我來說是解決問題一用的,達(dá)成目的即可,其他的?shut up!
c++是最不適合作為編程入門的,因?yàn)樗囊?guī)則太復(fù)雜了,對于新人來說,當(dāng)學(xué)習(xí)時這些東西撲面而來很容易把人嚇蒙的!什么是顯式構(gòu)造、什么是拷貝構(gòu)造、析構(gòu)函數(shù)為什么要virtual、虛函數(shù)是什么、虛基類是為了什么存在的、運(yùn)算符重載的規(guī)則是什么、指針和引用的區(qū)別、模板有那些黑魔法、標(biāo)準(zhǔn)庫究竟會干些什么…… 不得不說它的很多特性,讓編程變?yōu)橄衲Хㄒ话愕拇嬖冢?dāng)使用者念咒語施放魔法時會產(chǎn)生非常強(qiáng)的成就感。但當(dāng)你對咒語一知半解時,一旦犯錯你需要翻經(jīng)閱典花費(fèi)大量的時候來搞明白。
所以我建議先從C開始,了解基礎(chǔ)語法之后嘗試更深入地了解本質(zhì),這對你接下來學(xué)python有好處。然后學(xué)學(xué)python,并用python嘗試去做一些事情,你會發(fā)現(xiàn)python的強(qiáng)大。最后學(xué)C++,雖然上面說了C++的語言魔法太復(fù)雜,但在當(dāng)前市場下,C++程序員的需求量還是很大的,因?yàn)镃++得益于他比C更快的開發(fā)效率以及python等腳本語言所無法比你的運(yùn)行效率,使其成為市場的一個剛需。