亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Qt的Android應用程序C/C++開發(fā)方法與實踐①

        2018-07-18 06:06:40閆鋒欣牛子杰杜爍煒潘天麗
        計算機系統(tǒng)應用 2018年7期
        關鍵詞:類庫跨平臺上機

        閆鋒欣, 牛子杰, 杜爍煒, 潘天麗

        (西北農(nóng)林科技大學 機械與電子工程學院, 楊凌 712100)

        隨著移動互聯(lián)網(wǎng)技術的飛速發(fā)展, 與智能手機應用程序APP開發(fā)相關的各類技術得到了不斷發(fā)展和深入應用, 開發(fā)了大量可在智能手機等移動終端運行的第三方應用程序APP, 但存在總體數(shù)量豐富而現(xiàn)有基礎功能代碼重用率低下的矛盾. 因此, 為了能夠有效地滿足面向移動智能計算復雜APP對低性能硬件資源、實時信息交互服務的需求, 將廣域分布的Java、C/C++、Python等源碼和腳本進行按需組織和管理, 以實現(xiàn)移動智能計算平臺(Windows Phone、iOS、Android等)和桌面操作系統(tǒng)(Windows、Mac OS、Linux/X11等)之間動態(tài)、跨自治域的資源共享與協(xié)同, 提高代碼資源的綜合利用率, 降低APP開發(fā)的技術難度和成本, 已成為一個重要的科學問題[1].

        為解決這一問題, 需要圍繞移動智能計算平臺APP開發(fā)模式建立能夠支持代碼資源共享和集成的技術方法. 近年來, 國內(nèi)外學術界和工業(yè)界的研發(fā)工作取得了大量積極成果: (1) 從APP開發(fā)模式看, 主要有Native原生型、Web網(wǎng)絡型和Hybrid混合型三種[2].其中, 原生開發(fā)是通過使用移動智能計算平臺操作系統(tǒng)的API來實現(xiàn)方便、快捷、高性能調(diào)用終端的軟硬件資源, 但存在學習難度大、移植性差等不足[3]; 網(wǎng)絡開發(fā)是依靠實時通信移動網(wǎng)絡來實現(xiàn)APP的全部功能, 具有開發(fā)簡單、速度快等優(yōu)點, 但存在斷網(wǎng)無法工作、硬件資源調(diào)用不便等缺點; 混合開發(fā)是借助第三方跨平臺開發(fā)框架來實現(xiàn)APP的各項功能. (2) 從APP開發(fā)使用的語言看, 原生開發(fā)在Windows Phone、Android和iOS平臺上會分別使用C#[4]、Java[5]和Objective-C[6], 網(wǎng)絡開發(fā)主要借助CSS3、HTML5、JavaScript等腳本與網(wǎng)絡服務器的通信[7,8], 而混合開發(fā)則會同時使用原生API的專用編程語言和網(wǎng)絡腳本[9].

        Android在移動智能計算領域中占有絕對的優(yōu)勢,Java是其官方開發(fā)語言工具. Java采用進程虛擬機的形式為Android APP提供虛擬運行環(huán)境, 并通過對APP屏蔽底層硬件平臺異構性的方式實現(xiàn)“一次編譯隨處運行”的跨平臺特性[10]. Norris等[11]利用Java和Python開發(fā)了可對大體量核磁共振數(shù)據(jù)進行并行化快速處理的 NMRFx; Radivoje等[12]借助 Java、JavaScript和HTML5等開發(fā)了具有高級功能和強大表現(xiàn)力的車載信息娛樂系統(tǒng); Gao等[13]采用Java + SQL Server開發(fā)了Android在線考試系統(tǒng), 可實現(xiàn)制卷、判分、數(shù)據(jù)處理等考試環(huán)節(jié)的全過程自動化處理; 劉偉等[14]利用Android智能手機和移動互聯(lián)網(wǎng)設計開發(fā)了一種便攜式角度測量儀, 具有良好的可操作性及便攜性. 然而, 基于Java的APP運行時需依賴于底層Dalvik虛擬機環(huán)境, 需要較好的計算性能和硬件資源[15,16]. 移動智能計算和物聯(lián)網(wǎng)的迅猛發(fā)展使這些問題在各類極端應用中得到了逐級放大, 已成為Java難以逾越的障礙.

        基于第三方跨平臺框架的APP混合開發(fā)模式是上述問題的有效解決方案之一[17]. PhoneGap、Titanium、jQuery等現(xiàn)有的第三方框架多基于CSS、HTML5、JavaScript等腳本, 雖然解決了APP的跨平臺問題, 但性能方面的提升并不明顯. 而Qt跨平臺編程框架的所有類都采用C/C++開發(fā), 底層類庫封裝了各平臺的本地化實現(xiàn), 因而具有極高運行效率, 并可廣泛運行于Windows、Mac OS、Android、Raspberry Pi等桌面和移動智能計算設備平臺[18–20]. 此外, Qt還支持HTML5、Python等解釋型腳本和多種編程語言[21].

        1 Android APP開發(fā)技術分析和框架設計

        1.1 APP開發(fā)技術分析

        Android移動智能計算平臺上APP開發(fā)模式主要有Native原生型、Web網(wǎng)絡型和Hybrid混合型三種:

        (1) Native型APP的開發(fā)主要是借助運行平臺自己的開發(fā)框架和API. 例如, 在Android平臺上, APP是通過Activity來調(diào)用平臺的底層API來執(zhí)行各項功能,而用戶執(zhí)行操作產(chǎn)生的交互結果、APP運行時需要的各類參數(shù)等都會以XML形式存儲起來.

        (2) Web型APP的開發(fā)主要體現(xiàn)在服務器端的環(huán)境配置. 在Android平臺上, 每個APP都可簡單地認為是由APP的用戶界面(GUI)外加一個Java Web構成的, 全部功能的實現(xiàn)都依賴于實時網(wǎng)絡.

        (3) Hybrid型APP的開發(fā)則主要是借助諸如Apache Cordova等的第三方框架進行開發(fā). 這種開發(fā)形式的優(yōu)點在于運行平臺與硬件資源調(diào)用API無關,缺點則包括調(diào)用性能差等.

        圖1 Cordova APP開發(fā)模式

        這里以圖1所示的Cordova第三方框架為例來進一步說明Android平臺下APP開發(fā)的技術特點.Cordova開發(fā)APP有跨平臺和面向平臺兩種開發(fā)方法,前者使用Cordova CLI (Command Line Interface)工具中的各類shell腳本集來管理APP所欲部署平臺的配置內(nèi)容, 后者使用基于Web的Cordova組件集、Shell腳本和Plugman工具等對底層Android平臺的SDK進行整合開發(fā). 可以看出, 這種開發(fā)方法仍需借助CSS、JS和Shell腳本等才能夠完成APP的開發(fā).

        1.2 基于C/C++的APP開發(fā)框架設計

        針對重新學習Java等編程語言所帶來的較高學習成本和技術風險問題, 極有必要開展Android平臺下基于C/C++的APP開發(fā)方法研究. 這里給出基于C/C++的APP開發(fā)框架, 如圖2所示.

        圖2 基于C/C++的APP預期開發(fā)方法

        圖2中, 采用C/C++開發(fā)APP的底層技術是解決C/C++和Java兩類語言之間的相互調(diào)用問題, 特別是針對Android平臺的Java和C/C++類庫之間相互調(diào)用的問題. 從APP功能開發(fā)和實現(xiàn)的角度看, 它的各種運算、控制等各功能模塊的開發(fā)實現(xiàn)都用的是C/C++代碼, 就為重用其他項目的既有代碼提供了直接入口, 也為C/C++開發(fā)人員專注于新功能代碼的編寫提供了接口. 同時, 與用戶交互的圖形用戶接口(GUI)、對Android底層API的調(diào)用、移動計算設備的硬件資源通信等銜接工作, 則可以通過第三方的C/C++類庫全權負責.

        上述類庫應具有的基本特點是: (1) 全部采用C/C++編程語言; (2) 具有與平臺無關的跨平臺能力;(3) 能夠滿足移動移動智能計算平臺硬件資源較低的苛刻要求. 為此, 本文選用已在桌面和嵌入式平臺領域內(nèi)廣泛應用的跨平臺開發(fā)框架Qt. 下面探討Qt開發(fā)Android APP的技術機制和實施方案.

        2 Qt開發(fā)Android APP的工作機制

        Qt是C/C++類庫開發(fā)框架, 因而必須先構建起與Java之間的相互調(diào)用通道. 從Android APP的底層來看, 只能利用Google的NDK(Native Development Kit)來為基于C/C++的Android APP提供必要的編譯工具和基礎文件. 同時, 還要利用NDK來將C/C++程序封裝嵌入到Android包文件(.apk)中, 以及對Android SDK升級后的頭文件和庫文件進行調(diào)用. 然而, 由于Android APP獨自運行于各自的Dalvik虛擬機中, 且NDK只對外開放了虛擬機的部分接口, 造成C/C++程序調(diào)試難度大、兼容性差等問題, 需先開展其封裝性研究.

        2.1 基于Qt的Android APP封裝模型的建立

        利用Qt C/C++類庫直接開發(fā)Android APP, 需要分別考慮APP開發(fā)的兩個部分:

        (1) 基于Qt類庫的C/C++程序部分. 這一部分主要是指APP實現(xiàn)數(shù)學計算、圖像處理等的那些功能;

        (2) 基于Java的Android底層資源調(diào)用API部分.這一部分主要是指與Android底層硬件通訊和調(diào)用等的功能.

        對于(1)來說, 該部分的代碼均是Qt C/C++的程序, 在Qt內(nèi)部會先經(jīng)Qt元對象編譯器(meta object compiler, moc) 將含有 emit、signals、slots、Q_OBJECT等關鍵字的Qt源代碼處理為面向?qū)ο蟮臉藴蔆++類, 然后再在不同平臺下分別利用g++、gcc、msvc等編譯器進行源代碼的(交叉)編譯, 最后通過對Qt等各依賴庫文件的鏈接, 生成可在不同平臺下運行的可執(zhí)行APP程序.

        對于(2)而言, 該部分主要是指通過Java、XML等描述的與Android平臺交互的各類資源, 包括manifest、assets/strings/images、Ministro service 和Java類等, 用來實現(xiàn)APP在Android平臺上的調(diào)用、權限獲取、通信部署等工作.

        為在(1)和(2)之間, 即基于Qt的“純”C/C++類源代碼和不對第三方開放的Android平臺之間, 需以JNI(Java Native Interface)為橋梁來實現(xiàn)兩者的協(xié)同工作. 當Qt調(diào)用Android系統(tǒng)中的部分已有功能時, 就可借助JNI訪問它們. 同時, Qt作為專注于跨平臺的C++開發(fā)框架, 也不可能全部實現(xiàn)Android的所有功能. 某種程度上, JNI成為Android APP和C++程序之間相互調(diào)用的唯一通道.

        為此, 本文給出如圖3所示的基于Qt的Android APP封裝模型. 其中, 在“模塊①”中, Qt會利用抽象層QPA (Qt Platform Abstraction)對全部操作系統(tǒng)平臺進行統(tǒng)一化支持, 確保采用Qt類庫的所有程序均可直接運行于所有操作系統(tǒng)平臺上, 且不限于Android平臺;在“模塊③”中, APP仍舊采用類似Java APP的形式,依靠獨自的Dalvik虛擬機無縫運行于Android平臺,這樣就可以通過所處的Dalvik虛擬機對第三方程序開放部分接口并支持外部的JNI調(diào)用; 當兩者需要交互通信時, 可分別利用Qt事件循環(huán)和Android事件循環(huán),借助“模塊②”中的類THREAD線程交換信息.

        圖3 基于Qt的Android APP封裝模型

        此外, 通過Qt對Java代碼的支持, 可進一步拓展Qt APP的功能和應用范圍, 把Qt C/C++程序封裝成.apk包文件并平穩(wěn)運行于Android平臺上.

        2.2 Qt C/C++與Android Java間的調(diào)用機制

        要基于Qt C/C++開發(fā)可運行于Android平臺的APP, 就必須先實現(xiàn)從Qt C/C++程序調(diào)用Java的Android線程. 這是因為, Android的部分API設計機理不允許對外完全開放且必須在Android的UI線程中進行調(diào)用[22]. 然而, 因Qt不可能實現(xiàn)Android的全部功能而又要在Qt中調(diào)用這些功能時, 就需采用一定的方式來將其運行于Android UI線程中.

        定義1. 正向調(diào)用. 從Qt C/C++事件循環(huán)線程到Android Java UI線程的調(diào)用稱為正向調(diào)用.

        定義2. 逆向調(diào)用. 從Android Java UI線程到Qt C/C++事件循環(huán)線程的調(diào)用稱為逆向調(diào)用.

        這里給出在Qt C/C++與Android Java兩者之間進行雙向調(diào)用的多線程機制, 如圖4所示.

        該機制的正向調(diào)用主要過程如下:

        三是建立健全農(nóng)村供水項目資金管理制度,提高資金使用效益。建立健全覆蓋項目立項、設計、實施、驗收、管理等環(huán)節(jié)在內(nèi)的整個資金運行全過程的管理制度體系,確保每項水利資金都有相應的資金管理制度,嚴格使用管理。對農(nóng)村飲水安全項目的中央投資和省、市配套資金,在市農(nóng)村飲水安全項目辦公室設專戶管理,實行市級報賬制;縣級自籌資金在縣農(nóng)村飲水安全項目辦公室設專戶管理,實行縣級報賬制。對婦基會的專項百事慈善資金加強管理,屬于工程部分全部用于項目,采取水務局到婦聯(lián)報賬的管理辦法。

        步驟1. 在Qt C/C++事件循環(huán)線程中調(diào)用自定義的Java方法并在Qt線程中執(zhí)行, 設該方法的名稱為cppCallJava(), 為在Android Java線程中訪問Android的API做好準備.

        步驟2. 在cppCallJava()方法中, 借助Android的Activity.runOnUiThread, 向Android的UI線程事件隊列中添加一個public型Runnable動作并在Android的UI線程中執(zhí)行這個Runnable動作.

        步驟3. 因處于執(zhí)行狀態(tài)的Runnable對象本已在Android的UI線程中, 因而就可以直接訪問所需的Android API.

        若Android平臺中的原生Java APP需調(diào)用基于Qt的C/C++ APP, 就形成了逆向調(diào)用過程. 此時, 與正向調(diào)用類似, 同樣可在Android UI線程中調(diào)用Qt的C/C++函數(shù).

        圖4 Qt與Android之間的技術關聯(lián)

        逆向調(diào)用的主要過程包括:

        步驟1. 在Android UI線程中調(diào)用相應的Qt C/C++方法, 令其名稱為javaCallCpp().

        步驟 2. 在 javaCallCpp()方法中, 使用 Qt的QMetaObject: : invokeMethod方法向Qt事件隊列中添加一個異步或同步調(diào)用.

        步驟3. 在Qt線程中, 處理javaCallCpp()方法所添加的調(diào)用事件.

        經(jīng)過上述雙向調(diào)用后, 就可以實現(xiàn)Qt C/C++功能程序和Android Java API之間的相互調(diào)用了.

        3 實驗結果及展示

        3.1 基于Qt的學生導教APP設計

        圖5給出的是機械CAD技術基礎課程上機實踐的基本流程. 學生在實驗室機房按照授課內(nèi)容完成對應的上機編程練習, 用U盤等保存自己的代碼. 因各章內(nèi)容相對獨立, 上機實踐完成的習題源代碼也相對分散, 僅有30%左右的學生能夠在最后一次的綜合實踐課中重用這些代碼; 同時, 由于機房內(nèi)臺式機完成的程序無法移植到學生的智能手機、平板等可移動智能計算設備上, 導致每次上機實驗中學生主動編程的積極性不高, 相互復制抄襲的比例較高, 上機訓練效果一般.此外, 因課程內(nèi)容與實際的學習生活關聯(lián)性不強, 學生缺少成就感.

        圖5 傳統(tǒng)機械CAD上機訓練流程

        針對上述問題, 將學生每次上機實踐訓練時完成的C/C++程序代碼作為APP的各項功能, 通過使用Qt構建的APP UI界面和QPA類屏蔽與Android平臺相關的硬件資源具體差異, 再利用Qt的多線程機制在C/C++事件和Android Java事件之間建立通信聯(lián)系, 就可以開發(fā)出Android版的機械CAD導教APP. 整個APP的體系架構和各模塊間的邏輯關系如圖6所示.

        圖6 Android版機械CAD導教APP的體系架構

        APP可實現(xiàn)的基本功能包括: (1) 在APP中查看不同章節(jié)的上機實驗安排, 了解實驗原理、算法步驟、注意事項等; (2) 點選單項實驗后可通過完善模板空白或借助對話框、單(復)選框等進行人機交互; (3)根據(jù)教師發(fā)布的新消息或內(nèi)容更新, 由系統(tǒng)自動提示給相應的學生群組; (4) 點擊“運行”等按鈕后執(zhí)行內(nèi)置的單項實驗程序樣例, 為上機實驗提供參考和指導; (5)閱讀、編輯、保存或另存修改后的核心程序代碼.

        3.2 導教APP的開發(fā)過程

        本文以Win7為開發(fā)平臺, 利用Qt C/C++來完成APP的全部開發(fā)工作. 基于Qt C/C++開發(fā)框架中的Qt Designer、uic、moc等輔助開發(fā)工具, 可以把開發(fā)的用戶界面翻譯為XML中間文件, 再通過內(nèi)部編譯連接工具翻譯為可在Android平臺下運行的二進制文件. 同時, 為了能夠方便地“一鍵”實現(xiàn)從C/C++源代碼開發(fā)環(huán)境直接到Android平臺上APP的自動運行, 還可以使用Ant、Gradle等自助打包開源軟件. 為此, 將完成各部分輔助開發(fā)功能的(開源)軟件整理后列示在表1中.

        表1 Win7平臺APP開發(fā)所需的輔助工具

        具體來說, 各軟件的主要作用是: (1) Android SDK,即Software Development Kit(Android軟件開發(fā)工具包), 采用Java開發(fā)完成, 是Android APP運行所需的底層基礎組件和Android平臺開發(fā)的專屬工具包; (2)JDK, 即Java Development Kit(Java開發(fā)工具包), 包括Java運行環(huán)境(Java虛擬機與Java系統(tǒng)類庫)和Java基本組件工具; (3) Apache Ant或者Gradle可生成APP的. apk包文件, 可自動完成編譯、測試和部署等步驟; (4) ADB, 即Android Debug Bridge(Android調(diào)試橋), 可在電腦上調(diào)試Android手機設備或模擬器;(5) Google NDK, 即Native Develop Kit(原生開發(fā)工具包), 支持Android平臺調(diào)用C/C++程序.

        基于Qt C/C++的Android APP開發(fā)步驟主要包括:

        步驟1. 安裝所需開發(fā)工具軟件并對其進行配置.各輔助開發(fā)工具軟件的安裝配置要遵循先安裝再配置的方式來有效解決相互之間的依賴關系, 如表1中的各軟件工具可在依次安裝Qt、JDK、Apache Ant、Gradle、Android NDK、SDK和Google ADB后, 在對它們的運行環(huán)境變量進行相應的設置.

        步驟2. 利用QtCreator中內(nèi)嵌的Qt Designer開發(fā)APP的用戶界面, 在相應的功能模塊區(qū)域中填充相應的按鈕、輸入框等窗口部件, 設計過程中隨時可以使用Alt+Shift+R快捷鍵等方式預覽設計效果, 如圖7所示.

        步驟3. 通過添加不同的信號-槽連接, 設置所需的JNI靜態(tài)函數(shù), 將界面元素和相應的功能實現(xiàn)源程序代碼關聯(lián)起來, 達到點擊按鈕產(chǎn)生相應動作響應的效果; 同時, 為加速開發(fā)過程和減少功能優(yōu)化時的復雜性, 可先采用Desktop桌面形式進行開發(fā)調(diào)試, 并綜合利用QtCreator集成開發(fā)環(huán)境中的編譯、連接功能對APP系統(tǒng)進行優(yōu)化、測試和調(diào)試.

        步驟4. 達到APP設計的滿意效果后, 將QtCreator中運行模式調(diào)整為Android for armeabi-v7a, 然后進行編譯、連接和. apk包在Android操作平臺上的自動安裝. 生成的. apk安裝包文件既可以通過手動方式在Android手機上安裝, 也可通過配置QtCreator開發(fā)環(huán)境后自動安裝.

        圖7 APP軟件系統(tǒng)在桌面環(huán)境下的開發(fā)效果

        3.3 結果展示與評價

        圖8(a)是Android版機械CAD課程導教APP在手機(型號HUAWEI MT7-CL00)橫放時的顯示效果,用戶此時選定了計算“V帶尺寸”實驗. 在APP界面的左側, 給出了各章上機實踐所需完成的任務, 還包括“平鍵尺寸”、“一元插值”、“V帶功率”等實驗項目; 界面中間是每個實驗的說明, 未顯示完全的文字可通過邊側的滑動條進行翻頁; 界面右側是該項實驗所需的核心代碼.

        圖8中的黑色區(qū)域是手機屏幕的上方和右側, 用來顯示Android手機的系統(tǒng)菜單欄. 值得注意的是, 只有當如圖8(a)所示的形式, 對APP中的敘述性文字或者代碼進行了修改時, 按鈕“保存”和“另存為…”才會變?yōu)榭捎脿顟B(tài). 圖8(b)給出的是在點擊了圖8(a)中的按鈕“運行”后, 查詢出的Z型V帶(其代號為1)的截面尺寸值; 圖8(c)是同一計算過程在Win7操作系統(tǒng)下的顯示效果. 可以看出, 同一對話框因運行平臺所能夠支持的默認參數(shù)不同而具有一定的顯示效果差異.

        圖8 Android 6.0下APP運行效果及查詢結果對比

        在 2016–2017學年第 1學期 (2016年 10月17日~12月25日)的機械CAD課上機實踐訓練過程中, 由機制專業(yè)的122名本科生首次使用Android版機械CAD導教APP進行了性能測試和實驗評估. 圖9給出了全體學生使用頻率的時間分布, 可以看出, 從第8周課程開始到第17周課程結束, 10周期間共收到學生提交更新建議19項、疏漏補正76個, APP打開使用6025次(網(wǎng)絡連接狀態(tài)). 以10周共50個工作日為例,每天人均使用0.988次, 說明在日常教學活動中得到了較好應用. 從第二周的周五開始, 每周五都有較高的使用次數(shù), 這也與周五是上機實踐訓練課的實際情況相符. 在周一至周四的日常學習期間使用量并不多, 可見本科生并不愿意在專業(yè)課上投入過多的學習時間和精力.

        圖9 APP的每周使用數(shù)分布

        可以看出, 利用C/C++編程開發(fā)語言并借助Qt開發(fā)框架, 通過使用相關開源軟件能夠開發(fā)出滿足實際需要的Android APP應用程序, 既降低了重新學習Java和JavaScript等開發(fā)環(huán)境所帶來的負擔, 又為重用已有的C/C++程序提供了新途徑.

        4 結論與展望

        本文在分析了Google的NDK不能為C/C++程序提供全部Android功能調(diào)用的基礎下, 給出了基于Qt C/C++框架開發(fā)Android APP的方法和原理, 深入闡釋了Qt C/C++與Android Java兩者之間的調(diào)用方法, 給出了Win7平臺下開發(fā)Android APP過程的主要步驟.同時, 通過Android版機械CAD導教APP的開發(fā)和該APP的實際使用結果的展示和評價, 說明了基于Qt C/C++開發(fā)Android APP方法的有效性和可行性. 在未來的研究工作中, 將進一步對復雜需求環(huán)境(如圖形快速渲染等)下基于Qt和Java開發(fā)的Android APP綜合運算性能做出分析和評測.

        猜你喜歡
        類庫跨平臺上機
        周金應
        標準化護理程序?qū)w外膜肺氧合術患者上機各階段用時的影響
        用Java編寫客戶機/服務器端應用程序
        Python在數(shù)據(jù)可視化中的應用
        跨平臺APEX接口組件的設計與實現(xiàn)
        測控技術(2018年9期)2018-11-25 07:44:58
        數(shù)據(jù)結構課程教學改革方案和應用效果
        軟件工程(2017年12期)2018-01-29 17:35:55
        數(shù)據(jù)結構可視化類庫的設計與實現(xiàn)
        基于QT的跨平臺輸電鐵塔監(jiān)控終端軟件設計與實現(xiàn)
        基于OPC跨平臺通信的電機監(jiān)測與診斷系統(tǒng)
        基于B/S的跨平臺用戶界面可配置算法研究
        免费看泡妞视频app| 亚洲精品一区二在线观看| 国产女人精品一区二区三区| 午夜国产一区二区三区精品不卡| 精品国产又大又黄又粗av| 精品999无码在线观看| 男男做h嗯啊高潮涩涩| 蜜臀久久99精品久久久久久| 欧洲熟妇色xxxxx欧美老妇伦| 亚洲天堂免费视频| 国产精品高清亚洲精品| 亚洲av免费不卡在线观看| 97午夜理论片影院在线播放| 人妻av中文字幕无码专区| 亚洲午夜无码AV不卡| 在线观看国产精品一区二区不卡| 91九色熟女潮喷露脸合集| 亚洲 欧美 国产 制服 动漫| 永久免费观看的毛片手机视频| av狼人婷婷久久亚洲综合| 日本在线一区二区三区视频| 又大又长粗又爽又黄少妇视频| 亚洲粉嫩高潮的18p| 久久久精品免费国产四虎| 国产女主播免费在线观看| 男女主共患难日久生情的古言| 国产人妻精品无码av在线| 一区二区国产在线观看| 国产蜜臀精品一区二区三区| 尤物在线观看一区蜜桃| 欧美大屁股xxxxhd黑色 | 最新日韩av在线不卡| 国产av普通话对白国语| 久久精品国产av麻豆五月丁| 亚洲av麻豆aⅴ无码电影| 午夜精品一区二区三区无码不卡| 视频一区二区三区国产| 欧美大屁股xxxx高潮喷水| 色婷婷五月综合亚洲小说| 人妻少妇精品视频一区二区三区 | 麻豆激情视频在线观看|