AndroidCamera框架結(jié)構(gòu)培訓(xùn)講學(xué)_第1頁
AndroidCamera框架結(jié)構(gòu)培訓(xùn)講學(xué)_第2頁
AndroidCamera框架結(jié)構(gòu)培訓(xùn)講學(xué)_第3頁
AndroidCamera框架結(jié)構(gòu)培訓(xùn)講學(xué)_第4頁
AndroidCamera框架結(jié)構(gòu)培訓(xùn)講學(xué)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。AndroidCamera框架結(jié)構(gòu)-Android的Camera架構(gòu)介紹1.1Camera概述Android的Camera包含取景器(viewfinder)和拍攝照片的功能。目前Android發(fā)布版的Camera程序雖然功能比較簡單,但是其程序的架構(gòu)分成客戶端和服務(wù)器兩個部分,它們建立在Android的進(jìn)程間通訊Binder的結(jié)構(gòu)上。以開源的Android為例,Camera的代碼主要在以下的目錄中:Camera的JAVA程序的路徑:packages/apps/Camera/src/com/android

2、/camera/在其中Camera.java是主要實現(xiàn)的文件frameworks/base/core/java/android/hardware/Camera.java這個類是和JNI中定義的類是一個,有些方法通過JNI的方式調(diào)用本地代碼得到,有些方法自己實現(xiàn)。Camera的JAVA本地調(diào)用部分(JNI):frameworks/base/core/jni/android_hardware_Camera.cpp這部分內(nèi)容編譯成為目標(biāo)是libandroid_runtime.so。主要的頭文件在以下的目錄中:frameworks/base/include/ui/Camera底層庫在以下的目錄中:fr

3、ameworks/base/libs/ui/這部分的內(nèi)容被編譯成庫libui.so。Camera服務(wù)部分:frameworks/base/camera/libcameraservice/這部分內(nèi)容被編譯成庫libcameraservice.so。為了實現(xiàn)一個具體功能的Camera,在最底層還需要一個硬件相關(guān)的Camer庫(例如通過調(diào)用videoforlinux驅(qū)動程序和Jpeg編碼程序?qū)崿F(xiàn))。這個庫將被Camera的服務(wù)庫libcameraservice.so調(diào)用。1.2Camera的接口與架構(gòu)Camera的整體框架圖Camera的各個庫之間的結(jié)構(gòu)可以用下圖的表示:在Camera系統(tǒng)的各個庫中

4、,libui.so位于核心的位置,它對上層的提供的接口主要是Camera類,類libandroid_runtime.so通過調(diào)用Camera類提供對JAVA的接口,并且實現(xiàn)了android.hardware.camera類。libcameraservice.so是Camera的服務(wù)器程序,它通過繼承l(wèi)ibui.so的類實現(xiàn)服務(wù)器的功能,并且與libui.so中的另外一部分內(nèi)容則通過進(jìn)程間通訊(即Binder機(jī)制)的方式進(jìn)行通訊。libandroid_runtime.so和libui.so兩個庫是公用的,其中除了Camera還有其他方面的功能。Camera部分的頭文件在frameworks/ba

5、se/include/ui/目錄中,這個目錄是和libmedia.so庫源文件的目錄frameworks/base/libs/ui/相對應(yīng)的。Camera主要的頭文件有以下幾個:ICameraClient.hCamera.hICamera.hICameraService.hCameraHardwareInterface.h在這些頭文件Camera.h提供了對上層的接口,而其他的幾個頭文件都是提供一些接口類(即包含了純虛函數(shù)的類),這些接口類必須被實現(xiàn)類繼承才能夠使用。整個Camera在運行的時候,可以大致上分成Client和Server兩個部分,它們分別在兩個進(jìn)程中運行,它們之間使用Binde

6、r機(jī)制實現(xiàn)進(jìn)程間通訊。這樣在客戶端調(diào)用接口,功能則在服務(wù)器中實現(xiàn),但是在客戶端中調(diào)用就好像直接調(diào)用服務(wù)器中的功能,進(jìn)程間通訊的部分對上層程序不可見。從框架結(jié)構(gòu)上來看,ICameraService.h、ICameraClient.h和ICamera.h三個類定義了camera的接口和架構(gòu),ICameraService.cpp和Camera.cpp兩個文件用于Camera架構(gòu)的實現(xiàn),Camera的具體功能在下層調(diào)用硬件相關(guān)的接口來實現(xiàn)。從Camera的整體結(jié)構(gòu)上,類Camera是整個系統(tǒng)核心,ICamera類提供了Camera主要功能的接口,在客戶端方面調(diào)用,CameraService是Camer

7、a服務(wù),它通過調(diào)用實際的Camera硬件接口來實現(xiàn)功能。事實上,圖中紅色虛線框的部分都是Camera程序的框架部分,它主要利用了Android的系統(tǒng)的Binder機(jī)制來完成通訊。藍(lán)色的部分通過調(diào)用Camera硬件相關(guān)的接口完成具體的Camera服務(wù)功能,其它的部分是為上層的JAVA程序提供JNI接口。在整體結(jié)構(gòu)上,左邊可以視為一個客戶端,右邊是一個可以視為服務(wù)器,二者通過Android的Bimder來實現(xiàn)進(jìn)程間的通訊。頭文件ICameraClient.hICameraClient.h用于描述一個Camera客戶端的接口,定義如下所示:classICameraClient:publicIInte

8、rfacepublic:DECLARE_META_INTERFACE(CameraClient);virtualvoidshutterCallback()=0;virtualvoidrawCallback(constsp&picture)=0;virtualvoidjpegCallback(constsp&picture)=0;virtualvoidframeCallback(constsp&frame)=0;virtualvoiderrorCallback(status_terror)=0;virtualvoidautoFocusCallback(boolfocused)=0;classBn

9、CameraClient:publicBnInterfacepublic:virtualstatus_tonTransact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags=0);在定義中,ICameraClient類繼承IInterface,并定義了一個Camera客戶端的接口,BnCameraClient繼承了BnInterface,這是為基于Android的基礎(chǔ)類Binder機(jī)制實現(xiàn)在進(jìn)程通訊而構(gòu)建的。根據(jù)BnInterface類模版的定義BnInterface類相當(dāng)于雙繼承了BnInterface和ICameraClie

10、nt。IcameraClient這個類的主要接口是幾個回調(diào)函數(shù)shutterCallback、rawCallback和jpegCallback等,它們在相應(yīng)動作發(fā)生的時候被調(diào)用。作為Camera的“客戶端”,需要自己實現(xiàn)幾個回調(diào)函數(shù),讓服務(wù)器程序去“間接地”調(diào)用它們。頭文件Camera.hCamera.h是Camera對外的接口頭文件,它被實現(xiàn)CameraJNI的文件android_hardware_Camera.cpp所調(diào)用。Camera.h最主要是定義了一個Camera類:classCamera:publicBnCameraClient,publicIBinder:DeathRecipie

11、ntpublic:staticspconnect();Camera();voiddisconnect();status_tgetStatus()returnmStatus;status_tsetPreviewDisplay(constsp&surface);status_tstartPreview();voidstopPreview();status_tautoFocus();status_ttakePicture();status_tsetParameters(constString8¶ms);String8getParameters()const;voidsetShutterCal

12、lback(shutter_callbackcb,void*cookie);voidsetRawCallback(frame_callbackcb,void*cookie);voidsetJpegCallback(frame_callbackcb,void*cookie);voidsetFrameCallback(frame_callbackcb,void*cookie);voidsetErrorCallback(error_callbackcb,void*cookie);voidsetAutoFocusCallback(autofocus_callbackcb,void*cookie);/I

13、CameraClientinterfacevirtualvoidshutterCallback();virtualvoidrawCallback(constsp&picture);virtualvoidjpegCallback(constsp&picture);virtualvoidframeCallback(constsp&frame);virtualvoiderrorCallback(status_terror);virtualvoidautoFocusCallback(boolfocused);/從接口中可以看出Camera類剛好實現(xiàn)了一個Camera的基本操作,例如播放(startPr

14、eview)、停止(stopPreview)、暫停(takePicture)等。在Camera類中connect()是一個靜態(tài)函數(shù),它用于得到一個Camera的實例。在這個類中,具有設(shè)置回調(diào)函數(shù)的幾個函數(shù):setShutterCallback、setRawCallback和setJpegCallback等,這幾個函數(shù)是為了提供給上層使用,上層利用這幾個設(shè)置回調(diào)函數(shù),這些回調(diào)函數(shù)在相應(yīng)的回調(diào)函數(shù)中調(diào)用,例如使用setShutterCallback設(shè)置的回調(diào)函數(shù)指針被shutterCallback所調(diào)用。在定義中,ICameraClient類雙繼承了IInterface和IBinder:Death

15、Recipient,并定義了一個Camera客戶端的接口,BnCameraClient繼承了BnInterface,這是為基于Android的基礎(chǔ)類Binder機(jī)制實現(xiàn)在進(jìn)程通訊而構(gòu)建的。事實上,根據(jù)BnInterface類模版的定義BnInterface類相當(dāng)于雙繼承了BnInterface和ICameraClient。這是Android一種常用的定義方式。繼承了DeathNotifier類之后,這樣當(dāng)這個類作為IBinder使用的時候,當(dāng)這個Binder即將Died的時候被調(diào)用其中的binderDied函數(shù)。繼承這個類基本上實現(xiàn)了一個回調(diào)函數(shù)的功能。頭文件ICamera.hICamera.

16、h描述的內(nèi)容是一個實現(xiàn)Camera功能的接口,其定義如下所示:classICamera:publicIInterfacepublic:DECLARE_META_INTERFACE(Camera);virtualvoiddisconnect()=0;virtualstatus_tsetPreviewDisplay(constsp&surface)=0;virtualvoidsetHasFrameCallback(boolinstalled)=0;virtualstatus_tstartPreview()=0;virtualvoidstopPreview()=0;virtualstatus_tau

17、toFocus()=0;virtualstatus_ttakePicture()=0;virtualstatus_tsetParameters(constString8¶ms)=0;virtualString8getParameters()const=0;classBnCamera:publicBnInterfacepublic:virtualstatus_tonTransact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags=0);ICamera.h描述的內(nèi)容是一個實現(xiàn)Camera功能的接口,其定義如下所示:在came

18、ra類中,主要定義Camera的功能接口,這個類必須被繼承才能夠使用。值得注意的是,這些接口和Camera類的接口有些類似,但是它們并沒有直接的關(guān)系。事實上,在Camera類的各種實現(xiàn)中,一般都會通過調(diào)用ICamera類的實現(xiàn)類來完成。頭文件ICameraService.hICameraService.h用于描述一個Camera的服務(wù),定義方式如下所示:classICameraService:publicIInterfacepublic:DECLARE_META_INTERFACE(CameraService);virtualspconnect(constsp&cameraClient)=0;

19、classBnCameraService:publicBnInterfacepublic:virtualstatus_tonTransact(uint32_tcode,constParcel&data,Parcel*reply,uint32_tflags=0);由于具有純虛函數(shù),ICameraService以及BnCameraService必須被繼承實現(xiàn)才能夠使用,在ICameraService只定義了一個connect()接口,它的返回值的類型是sp,這個ICamera是提供實現(xiàn)功能的接口。注意,ICameraService只有連接函數(shù)connect(),沒有斷開函數(shù),斷開的功能由ICame

20、ra接口來提供。頭文件CameraHardwareInterface.hCameraHardwareInterface.h定義的是一個Camera底層的接口,這個類的實現(xiàn)者是最終實現(xiàn)Camera的。CameraHardwareInterface定以Camera硬件的接口,如下所示:classCameraHardwareInterface:publicvirtualRefBasepublic:virtualCameraHardwareInterface()virtualspgetPreviewHeap()const=0;virtualstatus_tstartPreview(preview_ca

21、llbackcb,void*user)=0;virtualvoidstopPreview()=0;virtualstatus_tautoFocus(autofocus_callback,void*user)=0;virtualstatus_ttakePicture(shutter_callback,raw_callback,jpeg_callback,void*user)=0;virtualstatus_tcancelPicture(boolcancel_shutter,boolcancel_raw,boolcancel_jpeg)=0;virtualstatus_tsetParameters

22、(constCameraParameters¶ms)=0;virtualCameraParametersgetParameters()const=0;virtualvoidrelease()=0;virtualstatus_tdump(intfd,constVector&args)const=0;使用C語言的方式導(dǎo)出符號:externCspopenCameraHardware();在程序的其他地方,使用openCameraHardware()就可以得到一個CameraHardwareInterface,然后調(diào)用CameraHardwareInterface的接口完成Camera的功能。

23、1.3Camera的主要實現(xiàn)分析JAVA程序部分在packages/apps/Camera/src/com/android/camera/目錄的Camera.java文件中,包含了對Camera的調(diào)用在Camera.java中包含對包的引用:importandroid.hardware.Camera.PictureCallback;importandroid.hardware.Camera.Size;在這里定義的Camera類繼承了活動Activity類,在它的內(nèi)部,包含了一個android.hardware.CamerapublicclassCameraextendsActivityimpl

24、ementsView.OnClickListener,SurfaceHolder.Callbackandroid.hardware.CameramCameraDevice;對Camera功能的一些調(diào)用如下所示:mCameraDevice.takePicture(mShutterCallback,mRawPictureCallback,mJpegPictureCallback);mCameraDevice.startPreview();mCameraDevice.stopPreview();startPreview、stopPreview和takePicture等接口就是通過JAVA本地調(diào)用(J

25、NI)來實現(xiàn)的。frameworks/base/core/java/android/hardware/目錄中的Camera.java文件提供了一個JAVA類:Camera。publicclassCamera在這個類當(dāng)中,大部分代碼使用JNI調(diào)用下層得到,例如:publicvoidsetParameters(Parametersparams)Log.e(TAG,setParameters();/params.dump();native_setParameters(params.flatten();再者,例如以下代碼:publicfinalvoidsetPreviewDisplay(Surface

26、Holderholder)setPreviewDisplay(holder.getSurface();privatenativefinalvoidsetPreviewDisplay(Surfacesurface);兩個setPreviewDisplay參數(shù)不同,后一個是本地方法,參數(shù)為Surface類型,前一個通過調(diào)用后一個實現(xiàn),但自己的參數(shù)以SurfaceHolder為類型。Camera的JAVA本地調(diào)用部分Camera的JAVA本地調(diào)用(JNI)部分在frameworks/base/core/jni/目錄的android_hardware_Camera.cpp中的文件中實現(xiàn)。android

27、_hardware_Camera.cpp之中定義了一個JNINativeMethod(JAVA本地調(diào)用方法)類型的數(shù)組gMethods,如下所示:staticJNINativeMethodcamMethods=native_setup,(Ljava/lang/Object;)V,(void*)android_hardware_Camera_native_setup,native_release,()V,(void*)android_hardware_Camera_release,setPreviewDisplay,(Landroid/view/Surface;)V,(void*)android

28、_hardware_Camera_setPreviewDisplay,startPreview,()V,(void*)android_hardware_Camera_startPreview,stopPreview,()V,(void*)android_hardware_Camera_stopPreview,setHasPreviewCallback,(Z)V,(void*)android_hardware_Camera_setHasPreviewCallback,native_autoFocus,()V,(void*)android_hardware_Camera_autoFocus,nat

29、ive_takePicture,()V,(void*)android_hardware_Camera_takePicture,native_setParameters,(Ljava/lang/String;)V,(void*)android_hardware_Camera_setParameters,native_getParameters,()Ljava/lang/String;,(void*)android_hardware_Camera_getParameters;JNINativeMethod的第一個成員是一個字符串,表示了JAVA本地調(diào)用方法的名稱,這個名稱是在JAVA程序中調(diào)用的名

30、稱;第二個成員也是一個字符串,表示JAVA本地調(diào)用方法的參數(shù)和返回值;第三個成員是JAVA本地調(diào)用方法對應(yīng)的C語言函數(shù)。register_android_hardware_Camera函數(shù)將gMethods注冊為的類android/media/Camera,其主要的實現(xiàn)如下所示。intregister_android_hardware_Camera(JNIEnv*env)/RegisternativefunctionsreturnAndroidRuntime:registerNativeMethods(env,android/hardware/Camera,camMethods,NELEM(c

31、amMethods);android/hardware/Camera對應(yīng)JAVA的類android.hardware.Camera。Camera本地庫libui.soframeworks/base/libs/ui/中的Camera.cpp文件用于實現(xiàn)Camera.h提供的接口,其中一個重要的片段如下所示:constsp&Camera:getCameraService()Mutex:Autolock_l(mLock);if(mCameraService.get()=0)spsm=defaultServiceManager();spbinder;dobinder=sm-getService(Str

32、ing16(media.camera);if(binder!=0)break;LOGW(CameraServicenotpublished,waiting.);usleep(500000);/0.5swhile(true);if(mDeathNotifier=NULL)mDeathNotifier=newDeathNotifier();binder-linkToDeath(mDeathNotifier);mCameraService=interface_cast(binder);LOGE_IF(mCameraService=0,noCameraService!?);returnmCameraS

33、ervice;其中最重要的一點是binder=sm-getService(String16(media.camera);這個調(diào)用用來得到一個名稱為media.camera的服務(wù),這個調(diào)用返回值的類型為IBinder,根據(jù)實現(xiàn)將其轉(zhuǎn)換成類型ICameraService使用。一個函數(shù)connect的實現(xiàn)如下所示:spCamera:connect()spc=newCamera();constsp&cs=getCameraService();if(cs!=0)c-mCamera=cs-connect(c);if(c-mCamera!=0)c-mCamera-asBinder()-linkToDeath

34、(c);c-mStatus=NO_ERROR;returnc;connect通過調(diào)用getCameraService得到一個ICameraService,再通過ICameraService的cs-connect(c)得到一個ICamera類型的指針。調(diào)用connect將得到一個Camera的指針,正常情況下Camera的成員mCamera已經(jīng)初始化完成。一個具體的函數(shù)startPreview如下所示:status_tCamera:startPreview()returnmCamera-startPreview();這些操作可以直接對mCamera來進(jìn)行,它是ICamera類型的指針。其他一些函

35、數(shù)的實現(xiàn)也與setDataSource類似。libmedia.so中的其他一些文件與頭文件的名稱相同,它們是:frameworks/base/libs/ui/ICameraClient.cppframeworks/base/libs/ui/ICamera.cppframeworks/base/libs/ui/ICameraService.cpp在此處,BnCameraClient和BnCameraService類雖然實現(xiàn)了onTransact()函數(shù),但是由于還有純虛函數(shù)沒有實現(xiàn),因此這個類都是不能實例化的。ICameraClient.cpp中的BnCameraClient在別的地方也沒有實現(xiàn)

36、;而ICameraService.cpp中的BnCameraService類在別的地方被繼承并實現(xiàn),繼承者實現(xiàn)了Camera服務(wù)的具體功能。Camera服務(wù)libcameraservice.soframeworks/base/camera/libcameraservice/用于實現(xiàn)一個Camera的服務(wù),這個服務(wù)是繼承ICameraService的具體實現(xiàn)。在這里的Android.mk文件中,使用宏USE_CAMERA_STUB決定是否使用真的Camera,如果宏為真,則使用CameraHardwareStub.cpp和FakeCamera.cpp構(gòu)造一個假的Camera,如果為假則使用Cam

37、eraService.cpp構(gòu)造一個實際上的Camera服務(wù)。CameraService.cpp是繼承BnCameraService的實現(xiàn),在這個類的內(nèi)部又定義了類Client,CameraService:Client繼承了BnCamera。在運作的過程中CameraService:connect()函數(shù)用于得到一個CameraService:Client,在使用過程中,主要是通過調(diào)用這個類的接口來實現(xiàn)完成Camera的功能,由于CameraService:Client本身繼承了BnCamera類,而BnCamera類是繼承了ICamera,因此這個類是可以被當(dāng)成ICamera來使用的。Cam

38、eraService和CameraService:Client兩個類的結(jié)果如下所示:classCameraService:publicBnCameraServiceclassClient:publicBnCamera;wpmClient;在CameraService中的一個靜態(tài)函數(shù)instantiate()用于初始化一個Camera服務(wù),寒暑如下所示:voidCameraService:instantiate()defaultServiceManager()-addService(String16(media.camera),newCameraService();事實上,CameraServi

39、ce:instantiate()這個函數(shù)注冊了一個名稱為media.camera的服務(wù),這個服務(wù)和Camera.cpp中調(diào)用的名稱相對應(yīng)。Camera整個運作機(jī)制是:在Camera.cpp中可以調(diào)用ICameraService的接口,這時實際上調(diào)用的是BpCameraService,而BpCameraService又通過Binder機(jī)制和BnCameraService實現(xiàn)兩個進(jìn)程的通訊。而BpCameraService的實現(xiàn)就是這里的CameraService。因此,Camera.cpp雖然是在另外一個進(jìn)程中運行,但是調(diào)用ICameraService的接口就像直接調(diào)用一樣,從connect()

40、中可以得到一個ICamera類型的指針,真?zhèn)€指針的實現(xiàn)實際上是CameraService:Client。而這些Camera功能的具體實現(xiàn),就是CameraService:Client所實現(xiàn)的了,其構(gòu)造函數(shù)如下所示:CameraService:Client:Client(constsp&cameraService,constsp&cameraClient):mCameraService(cameraService),mCameraClient(cameraClient),mHardware(0)mHardware=openCameraHardware();mHasFrameCallback=fa

41、lse;構(gòu)造函數(shù)中,調(diào)用openCameraHardware()得到一個CameraHardwareInterface類型的指針,并作為其成員mHardware。以后對實際的Camera的操作都通過對這個指針進(jìn)行。這是一個簡單的直接調(diào)用關(guān)系。事實上,真正的Camera功能己通過實現(xiàn)CameraHardwareInterface類來完成。在這個庫當(dāng)中CameraHardwareStub.h和CameraHardwareStub.cpp兩個文件定義了一個樁模塊的接口,在沒有Camera硬件的情況下使用,例如在仿真器的情況下使用的文件就是CameraHardwareStub.cpp和它依賴的文件Fa

42、keCamera.cpp。CameraHardwareStub類的結(jié)構(gòu)如下所示:classCameraHardwareStub:publicCameraHardwareInterfaceclassPreviewThread:publicThread;在類CameraHardwareStub當(dāng)中,包含一個線程類PreviewThread,這個線程用于處理PreView,即負(fù)責(zé)刷新取景器的內(nèi)容。實際的Camera硬件接口通??梢酝ㄟ^對v4l2捕獲驅(qū)動的調(diào)用來實現(xiàn),同時還需要一個JPEG編碼程序?qū)尿?qū)動中取出的數(shù)據(jù)編碼成JPEG文件。1.4代碼分析Android應(yīng)用程序編程語言是JAVA,而linu

43、x的很多服務(wù)程序,包括一些libraries都是用c或者c+寫的,應(yīng)用程序使用什么樣的機(jī)制去調(diào)用這些系統(tǒng)函數(shù)的呢?Java的虛擬機(jī)可以通過System.loadLibrary來加載本地庫,也可以通過JNI函數(shù)RegisterNatives來注冊與類相關(guān)聯(lián)的本地方法。在Android中對于一些底層平臺相關(guān)的native函數(shù)大多采用注冊關(guān)聯(lián)的方式來調(diào)用。系統(tǒng)啟動后兩個重要的process:1:App_mainprocess:進(jìn)程通過AndroidRuntime調(diào)用register_jni_procs向JNI注冊模塊的native函數(shù)供JVM調(diào)用。2:Mediaserverproces:進(jìn)程注冊了以下幾個server:AudioFlinger,MediaPlayerServer;CameraService.AndroidCameraAppl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論