精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android開發(fā)進階:Android NDK介紹

移動開發(fā) Android
本文旨在幫助那些缺乏Android NDK經驗但又想擴充這方面知識的人們。我所關注的是JNI(本地編程接口,簡稱JNI)。本文分上下兩篇,在上篇中,會從JNI為接口開始講起;下篇會進行回顧,并給出帶兩個文件讀寫功能的實例。

導讀

為了在Android OS系統(tǒng)上開發(fā)應用程序,Google提供了兩種開發(fā)包:SDK和NDK。你可以從Google官方查閱到有許多關于SDK 的優(yōu)秀的書籍、文章作為參考,但Google沒有提供足夠的NDK資料。在現有的書籍中,我認為Cinar O.寫于2012年 的”Pro Android C++ with the NDK”值得一讀。

本文旨在幫助那些缺乏Android NDK經驗但又想擴充這方面知識的人們。我所關注的是JNI(本地編程接口,簡稱JNI)。本文分上下兩篇,在上篇中,會從JNI為接口開始講起;下篇會進行回顧,并給出帶兩個文件讀寫功能的實例。

什么是 Android NDK?

Android NDK(Native Development Kit )是一套工具集合,允許你用像C/C++語言那樣實現應用程序的一部分。

何時使用NDK?

Google僅在極少數情況下建議使用NDK,有如下使用場景:

  • 必須提高性能(例如,對大量數據進行排序)。
  • 使用第三方庫。舉例說明:許多第三方庫由C/C++語言編寫,而Android應用程序需要使用現有的第三方庫,如Ffmpeg、OpenCV這樣的庫。
  • 底層程序設計(例如,應用程序不依賴Dalvik Java虛擬機)。

什么是JNI?

JNI是一種在Java虛擬機控制下執(zhí)行代碼的標準機制。代碼被編寫成匯編程序或者C/C++程序,并組裝為動態(tài)庫。也就允許了非靜態(tài)綁定用法。這提供了一個在Java平臺上調用C/C++的一種途徑,反之亦然。

JNI的優(yōu)勢

與其他類似接口(Netscape Java運行接口、Microsoft的原始本地接口、COM/Java接口)相比,JNI主要的競爭優(yōu)勢在于:它在設計之初就確保了二進制的兼容 性,JNI編寫的應用程序兼容性以及在某些具體平臺上的Java虛擬機兼容性(當談及JNI,這里并不特別針對Dalvik;JNI由Oracle開發(fā), 適用于所有Java虛擬機)。這就是為什么C/C++編譯后的代碼無論在任何平臺上都能執(zhí)行。不過,一些早期版本并不支持二進制兼容。

二進制兼容性是一種程序兼容性類型,允許一個程序在不改變其可執(zhí)行文件的條件下在不同的編譯環(huán)境中工作。

JNI組織結構

 

 

圖1 — JNI接口指針
圖1 — JNI接口指針

 

 

這張JNI函數表的組成就像C++的虛函數表。虛擬機可以運行多張函數表,舉例來說,一張調試函數表,另一張是調用函數表。JNI接口指針僅在當前線程中起作用。這意味著指針不能從一個線程進入另一個線程。然而,可以在不同的線程中調用本地方法。

示例代碼:

  1. jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (JNIEnv *env, jobject obj, jint i, jstring s) 
  2.      const char *str = (*env)->GetStringUTFChars(env, s, 0); 
  3.      (*env)->ReleaseStringUTFChars(env, s, str); 
  4.      return 10
  • *env — 一個接口指針。
  • obj — 在本地方法中聲明的對象引用。
  • i和s — 用于傳遞的參數。

原始類型(Primitive Type)在虛擬機和本機代碼進行拷貝,對象之間使用引用進行傳遞。VM(虛擬機)要追蹤所有傳遞給本地代碼的對象引用。GC無法釋放所有傳遞給本地代碼的對象引用。與此同時,本機代碼應該通知VM不需要的對象引用。

局部引用和全局引用

JNI定義了三種引用類型:局部引用、全局引用和全局弱引用。局部引用在方法完成之前是有效的。所有通過JNI函數返回的Java對象都是本地引 用。程序員希望VM會清空所有的局部引用,然而局部引用僅在其創(chuàng)建的線程里可用。如果有必要,局部引用可以通過接口中的DeleteLocalRef JNI方法立即釋放:

  1. jclass clazz; 
  2. clazz = (*env)->FindClass(env, "java/lang/String"); 
  3. ... 
  4. (*env)->DeleteLocalRef(env, clazz) 

全局引用在完全釋放之前都是有效的。要創(chuàng)建一個全局引用,需要調用NewGlobalRef方法。如果全局引用并不是必須的,可以通過DeleteGlobalRef方法刪除:

  1. jclass localClazz; 
  2. jclass globalClazz; 
  3. ... 
  4. localClazz = (*env)->FindClass(env, "java/lang/String"); 
  5. globalClazz = (*env)->NewGlobalRef(env, localClazz); 
  6. ... 
  7. (*env)->DeleteLocalRef(env, localClazz); 

錯誤

JNI不會檢查NullPointerException、IllegalArgumentException這樣的錯誤,原因是:

  • 導致性能下降。
  • 在絕大多數C的庫函數中,很難避免錯誤發(fā)生。

JNI允許用戶使用Java異常處理。大部分JNI方法會返回錯誤代碼但本身并不會報出異常。因此,很有必要在代碼本身進行處理,將異常拋給Java。在JNI內部,首先會檢查調用函數返回的錯誤代碼,之后會調用ExpectOccurred()返回一個錯誤對象。

  1. jthrowable ExceptionOccurred(JNIEnv *env); 

例如:一些操作數組的JNI函數不會報錯,因此可以調用ArrayIndexOutofBoundsException或ArrayStoreExpection方法報告異常。

JNI原始類型

JNI有自己的原始數據類型和數據引用類型。

Java類型

本地類型(JNI

描述

boolean(布爾型) jboolean 無符號8個比特
byte(字節(jié)型) jbyte 有符號8個比特
char(字符型) jchar 無符號16個比特
short(短整型) jshort 有符號16個比特
int(整型) jint 有符號32個比特
long(長整型) jlong 有符號64個比特
float(浮點型) jfloat 32個比特
double(雙精度浮點型) jdouble 64個比特
void(空型) void N/A

JNI引用類型

 

圖2 — JNI引用類型
圖2 — JNI引用類型

 

改進的UTF-8編碼

JNI使用改進的UTF-8字符串來表示不同的字符類型。Java使用UTF-16編碼。UTF-8編碼主要使用于C語言,因為它的編碼用\u000表示為0xc0,而不是通常的0×00。非空ASCII字符改進后的字符串編碼中可以用一個字節(jié)表示。

#p#

JNI函數:

JNI接口不僅有自己的數據集(dataset)也有自己的函數?;仡欉@些數據集和函數需要花費我們很多時間。可以從官方文檔中找到更多信息:

http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html

JNI函數使用示例

下面會通過一個簡短的示例確保你對這些資料所講的內容有了正確的理解:

  1. #include <jni.h> 
  2.     ... 
  3. JavaVM *jvm; 
  4. JNIEnv *env; 
  5. JavaVMInitArgs vm_args; 
  6. JavaVMOption* options = new JavaVMOption[1]; 
  7. options[0].optionString = "-Djava.class.path=/usr/lib/java"
  8. vm_args.version = JNI_VERSION_1_6; 
  9. vm_args.nOptions = 1; 
  10. vm_args.options = options; 
  11. vm_args.ignoreUnrecognized = false
  12. JNI_CreateJavaVM(&jvm, &env, &vm_args); 
  13. delete options; 
  14. jclass cls = env->FindClass("Main"); 
  15. jmethodID mid = env->GetStaticMethodID(cls, "test""(I)V"); 
  16. env->CallStaticVoidMethod(cls, mid, 100); 
  17. jvm->DestroyJavaVM(); 

讓我們來逐個分析字符串:

  • JavaVM — 提供了一個接口,可以調用函數創(chuàng)建、刪除Java虛擬機。
  • JNIEnv — 確保了大多數的JNI函數。
  • JavaVMlnitArgs —  Java虛擬機參數。
  • JavaVMOption — Java虛擬機選項。

JNI的_CreateJavaVM()方法初始化Java虛擬機并向JNI接口返回一個指針。

JNI_DestroyJavaVM()方法可以載入創(chuàng)建好的Java虛擬機。

線程

內核負責管理所有在Linux上運行的線程;線程通過AttachCurrentThread和AttachCurrentThreadAsDaemon函數附加到Java虛擬機。如果線程沒有被添加成功,則不能訪問JNIEnv。 Android系統(tǒng)不能停止JNI創(chuàng)建的線程,即使GC(Garbage Collection)在運行釋放內存時也不行。直到調用DetachCurrentThread方法,該線程才會從Java虛擬機脫離。

***步

你的項目結構應該如圖3所示:

 

圖3—工程結構
圖3—工程結構

 

在圖3中,所有本地代碼都存儲到一個jni的文件夾。在新建一個工程后,Libs文件夾會被分為四個子文件夾。這意味著一個子目錄對應一種處理器架構,庫的數量取決于處理器架構的數量。

要創(chuàng)建一個本地項目和一個Android項目可以參照以下面的步驟:

  • 創(chuàng)建一個jni文件夾 — 包含本地代碼的項目源代碼根目錄。
  • 創(chuàng)建一個Android.mk文件用來構建項目。
  • 創(chuàng)建一個Application.mk文件用來存儲編譯參數。雖然這不是必須的配置,但是推薦你這么做。這樣會使得編譯設置更加靈活。
  • 創(chuàng)建一個ndk-build文件以此來顯示編譯過程(同樣這一步也不是必須的)。

Android.mk

就像前面提到的,Android.mk是編譯本地項目的makefile。Android.mk把代碼按照模塊進行了劃分,把靜態(tài)庫(static library)拷貝到項目的libs文件夾,生成共享庫(shared library)和獨立的可執(zhí)行文件。

最精簡的配置示例:

  1. LOCAL_PATH := $(call my-dir) 
  2. include $(CLEAR_VARS) 
  3. LOCAL_MODULE    := NDKBegining 
  4. LOCAL_SRC_FILES := ndkBegining.c 
  5. include $(BUILD_SHARED_LIBRARY) 

讓我們來仔細看看:

  • LOCAL_PATH:-$(call my-dir)  — 調用函數宏my-dir返回當前文件所在路徑。
  • include $(CLEAR_VARS) — 清除所有LOCAL_PATH以外的變量。這是必須的步驟,考慮到所有編譯控制文件都位于同一個GNU MAKE執(zhí)行環(huán)境中,所有變量都是全局的。
  • LOCAL_MODULE — 輸出模塊名稱。在上述例子中,輸出模塊叫做NDKBegining。但是在生成以后,會在libs文件夾中創(chuàng)建libNDKbegining庫。同 時,Android系統(tǒng)會為其添加一個前綴名lib,例如一個被命名為”foo”的共享庫模塊,將會生成”libfoo.so”文件。 但是在Java代 碼中使用庫時應該忽略前綴名(也就是說,名稱應該和makefile一樣)。
  • LOCAL_SRC_FILE — 列出編譯所需要的源文件。
  • include $(BUILD_SHARED_LIBARY) — 輸出模塊的類型。

你可以在Android.mk文件中設置自定義變量;但是必須遵守語法命名規(guī)則:LOCAL_、PRIVATE_、NDK_、APP_、my-dir。Google建議自定義示例前綴使用MY_,例如:

MY_SOURCE := NDKBegining.c

這樣就調用了一個變量$(MY_SOURCE)。變量同樣也可以被連接起來,例如:

LOCAL_SRC_FILES += $(MY_SOURCE)

Application.mk

這個makefile中定義了好幾種變量讓編譯更加靈活:

  • APP_OPTM — 這個變量是可選的,用于指定程序是“release”還是“debug”。在構建應用程序模塊時,該變量用來優(yōu)化構建過程。你可以在調試中指定“release”,不過“debug”支持的配置選項更多。
  • APP_BUILD_SCRI為Android.mk定義了另一條路徑。
  • APP_ABI — 最重要的變量之一。它指定了編譯模塊時使用的目標處理器架構。默認情況下,APP_ABI會設置為“armeabi”,對應于ARMv5TE架構。例如, 如果要支持 ARMv7,就需要設置為“armeabi-v7a”。對于IA-32-x86和MIPS-mips這樣支持多體系架構的系統(tǒng),應該把 APP_ABI設置為“armeabi armeabi-v7a x86 mips”。在NDK修訂版本7或更高的版本中,可以簡單的設置APP_ABI := “all rather enumerating all the architectures”。
  • APP_PLATFORM — 為目標平臺名稱;
  • APP_STL — Android提供了一個最精簡的libstdc c++運行庫,因此開發(fā)人員使用的c++功能是非常有限的。然而使用APP_STL變量就可以使這些庫支持擴展功能。
  • NDK_TOOLCHAIN_VERSION-GCC — 選擇的GCC編譯器版本(默認情況下設置為4.6)。

NDK-BUILDS

NDK-build是一個GNU Make的包裝容器。在NDK 4以后,ndk-build支持以下參數:

  • clean — 清除所有已生成的二進制文件。
  • NDK_DEBUG=1 — 生成可調式的代碼。
  • NDK_LOG=1 — 顯示日志信息(用于調試)。
  • NDK_HOST_32BIT=1 — 使Android系統(tǒng)支持64位版本(例如,NDK_PATH\toolchains\mipsel-linux-android-4.8\prebuilt\windows-x86_64,等等)。
  • NDK_APPLICATION_MK=<file> — 指定Application.mk路徑。

在 NDK v5中,引入了NDK_DEBUG。當NDK_DEBUG設置為“1”時,便會生成可調試版本。如果沒有設置NDK_DEBUG,ndk-build會默 認驗證是否有在AndroidMainfest.xml文件中設置 android:debuggable=“true” 屬性。如果你使用的是NDK v8以后的版本,Google不建議你在AndoirdMainfest.xml文件中使用 android:debuggable 屬性(當你使用“ant debug”或ADT插件生成調試版本時,會自動添加“NDK_DEBUG=1”)。

默認情況下,設置了支持64位版本。你也可以通過設置“NDK_HOST_32BIT=1”強制使用一個32位的工具鏈來使用32位應用程序。不過,谷歌仍建議使用64位的應用程序來提升大型程序的性能。

如何建立一個項目?

這 是個令人頭疼的步驟。你要安裝CDT插件并下載cygwin或mingw編譯器和Android NDK,在Eclipse設置里配置這些東西,但***還 是不能運行。我***次開始使用Android NDK時,配置這些東西花了我3天時間。***發(fā)現問題出在Cygwin編譯器身上:應該為項目文件夾設置讀、寫、可執(zhí)行的所有權限。

現在可就簡單多咯!只需要照著這個鏈接到網址:http://developer.android.com/sdk/index.html 下載ADT包,這里面有開始編譯環(huán)節(jié)需要用到的所有東西。

從Java代碼中調用本地方法

要從Java中調用本地代碼,首先你要在Java類中定義本地方法。例如:

  1. native String nativeGetStringFromFile(String path) throws IOException; 
  2. native void nativeWriteByteArrayToFile(String path, byte[] b) throws IOException 

你得在方法前使用“native”關鍵字。,這樣編譯器就知道這是JNI的入口點。這些方法會在C/C++文件中實現。Google建議用 “native+x”這樣的命名方式,“x”代表著方法的實際名稱。還有,在實現這些方法前你還得手動生成一個頭文件。你可以手動執(zhí)行此操作或者使用 JDK的 javah工具生成頭文件。然后讓我們將進一步探討如何不用控制臺,直接使用標準的Eclipse開發(fā)環(huán)境:

  • 打開Eclipse,選擇Run -> External-tool-External -> External tools configurations。
  • 新建配置。
  • 指定javah.exe在jdk里的絕對路徑(例如,C:\Program Files (x86)\Java\jdk1.6.0_35\bin\javah.exe)。
  • 在工作目錄中指定bin/class目錄的路徑(例如,«${workspace_loc:/NDKBegin/bin/classes}»)。
  • 填入如下參數:“-jni ${java_type_name}” (注意,輸入時不需要帶引號)。

現在你可以運行了。你的頭文件應該放在bin/classes目錄下。下一步,復制這些文件到本地工程的jni目錄。打開工程的配置菜單并選擇 Andorid Tools這一項 — 添加本地庫(Add Native Library)。這樣我們就可以使用jni.h頭文件中包含的函數了。在此之后,你還要創(chuàng)建一個.cpp的文件(有時候 Eclipse會默認生成),并且方法實現已經在頭文件中定義。

考慮到文章長度和可讀性,我并沒有加入簡單的代碼示例,所以你在這里找不到。如果需要,請訪問這個鏈接https://github.com/viacheslavtitov/NDKBegining。

責任編輯:徐川 來源: ImportNew
相關推薦

2010-12-23 09:11:17

讀寫Android文件

2012-02-07 10:05:40

jQuery MobijQuery Mobi

2011-05-03 15:28:15

BlackBerryWidget

2014-01-07 14:53:37

Android開發(fā)依賴注入Roboguice

2011-10-18 10:17:39

Android應用開發(fā)

2011-10-18 10:25:08

Android應用開發(fā)

2013-01-16 15:07:30

Android NDKAndroid開發(fā)

2009-04-30 09:02:53

AcerAndroid開發(fā)

2011-08-17 16:23:31

iPhone開發(fā)UIViewContr

2014-07-30 16:43:49

Android

2013-01-16 14:41:14

Android開發(fā)Android SDK

2021-01-20 08:16:06

異步Dotnet Core多路徑

2011-08-17 16:29:12

iPhone開發(fā)UIButton

2010-08-11 10:58:06

AndroidAndroid NDK

2014-03-31 15:32:36

AndroidNDK開發(fā)

2011-05-31 15:09:02

Android SDK 官方下載

2021-12-30 10:43:21

Android函數Crash

2013-01-10 13:50:25

Android開發(fā)組件

2010-01-25 15:35:08

Android NDK

2019-07-09 09:48:41

前端開發(fā)技術
點贊
收藏

51CTO技術棧公眾號

日韩你懂的在线播放| 亚洲色图在线视频| 国产成人亚洲综合| 欧美视频一区二区在线| h视频久久久| 欧美色网站导航| 欧美乱做爰xxxⅹ久久久| 六十路在线观看| 国产精品综合av一区二区国产馆| 韩剧1988免费观看全集| 亚洲少妇xxx| 日韩在线你懂的| 91精品国产欧美一区二区成人| 国产素人在线观看| 欧美精品hd| 91亚洲精品久久久蜜桃| 91色精品视频在线| 黄色一级视频免费看| 欧美国产免费| 色多多国产成人永久免费网站| av av在线| 国产亚洲高清在线观看| 欧洲精品一区二区三区在线观看| 久草免费福利在线| 高潮毛片在线观看| 欧美国产欧美综合| 久久精品二区| 日本美女一级视频| 国产精品一区二区在线看| 国产精品电影网站| 日韩欧美成人一区二区三区| 你懂的国产精品| 日韩中文字幕免费看| 丰腴饱满的极品熟妇| 欧美一级三级| 精品福利一区二区三区| 国产高清999| 国产乱子精品一区二区在线观看| 色综合一区二区| 国产一区二区网| 蜜臀av在线| 亚洲伦理在线精品| 国产盗摄视频在线观看| 免费黄网在线观看| 中文字幕中文在线不卡住| 色乱码一区二区三在线看| 黄色av网站在线| 国产日产欧美精品一区二区三区| 另类欧美小说| 青青草在线免费视频| aa级大片欧美| 精品免费一区二区三区蜜桃| 日本美女一级视频| 波多野结衣视频一区| 国产精品成人观看视频免费| 亚洲精品国产精品国| 国产高清成人在线| 成人av免费电影| 国产福利免费视频| 国产成人精品网址| 国产精品国模大尺度私拍| 丰满岳乱妇国产精品一区| 国产99一区视频免费| 国模一区二区三区私拍视频| 性xxxx视频| 亚洲国产精品精华液2区45| 色综合666| 三区四区在线视频| 亚洲精品乱码久久久久久| 800av在线免费观看| 男人天堂视频在线观看| 91精品办公室少妇高潮对白| www.亚洲高清| 天堂va欧美ⅴa亚洲va一国产| 精品久久久网站| 人妻在线日韩免费视频| 国产a久久精品一区二区三区| 一区二区三区高清国产| 天天看天天摸天天操| 欧美日韩少妇| 日本一区二区不卡| 一区不卡在线观看| 丰满少妇久久久久久久| 欧美日本韩国国产| 久cao在线| 午夜免费久久看| 一区二区三区免费播放| 欧美视频二区欧美影视| 精品爽片免费看久久| 亚洲天堂精品一区| 韩国一区二区三区在线观看| 久久免费精品日本久久中文字幕| 精品黑人一区二区三区| 国产精品一区二区果冻传媒| 精品久久精品久久| 免费在线毛片网站| 黄色精品在线看| 亚洲一二三av| 亚洲另类春色校园小说| 欧美成人免费va影院高清| 天天干天天操天天爱| 韩国理伦片一区二区三区在线播放| 国产精品日韩高清| 91.xxx.高清在线| 五月天丁香久久| av噜噜在线观看| 亚洲最大在线| 久久久久久久电影一区| 伊人22222| www国产精品av| 四虎精品欧美一区二区免费| 日韩精选视频| 亚洲国产91精品在线观看| 国产精品视频看看| 水蜜桃久久夜色精品一区的特点| 成人精品水蜜桃| 麻豆视频在线观看免费网站| 色婷婷狠狠综合| 欧美xxxxx精品| 午夜精品av| 成人国产精品一区二区| 韩国中文字幕2020精品| 天天综合色天天| aaa黄色大片| 在线一区免费| 国产在线视频91| 国产日韩精品在线看| 欧美日韩免费看| 日韩Av无码精品| 韩国在线一区| 成人在线免费观看一区| 午夜dj在线观看高清视频完整版| 91.麻豆视频| 91麻豆精品久久毛片一级| 日韩电影一区二区三区四区| 欧美久久在线| 欧美黑人疯狂性受xxxxx野外| 日韩精品中文字幕在线观看| 成人免费区一区二区三区| 粉嫩av一区二区三区在线播放| 浴室偷拍美女洗澡456在线| 四虎视频在线精品免费网址| 搡老女人一区二区三区视频tv| 亚洲精品久久久久久久蜜桃| 国产调教视频一区| 午夜视频在线瓜伦| 国产精品嫩模av在线| 国产成人在线一区二区| 国产玉足榨精视频在线观看| 在线免费观看日本欧美| 国产在线综合视频| 欧美a一区二区| 色999日韩自偷自拍美女| 外国电影一区二区| 中文字幕在线亚洲| 中文字幕永久免费视频| 国产精品另类一区| 午夜免费福利视频在线观看| 亚洲有吗中文字幕| 91麻豆蜜桃| 91美女精品| 亚洲免费电影一区| 正在播放亚洲精品| 亚洲视频网在线直播| 1314成人网| 最新亚洲一区| 欧美一区激情视频在线观看| 精品视频在线一区二区在线| 精品久久久av| 欧美一级视频免费| 色噜噜夜夜夜综合网| www.97视频| av不卡在线播放| 亚洲一区在线不卡| 中文字幕一区二区av | 99tv成人影院| 九九热精品在线| 亚洲 精品 综合 精品 自拍| 欧美怡红院视频| 久久精品黄色片| 91视频一区二区| 在线观看国产福利| 亚洲人成久久| 亚洲国产精品一区二区第一页| 精品一区二区三区中文字幕| 午夜精品一区二区三区在线播放 | 人妻无码视频一区二区三区| 91嫩草亚洲精品| 国产一区免费观看| 欧美一区=区三区| 久久久免费精品| 91在线看黄| 亚洲丁香久久久| 中文字幕一区二区三区波野结| 亚洲成人一区二区在线观看| 999久久久国产| aaa欧美色吧激情视频| 不卡的在线视频| 免费视频一区| 免费看黄色a级片| 婷婷精品在线观看| 91沈先生播放一区二区| 亚洲欧美一区二区三区| 美女999久久久精品视频| 神马电影在线观看| 日韩一区二区三区免费看| 免费看污视频的网站| 亚洲一二三级电影| 免费成人深夜天涯网站| 99精品久久久久久| 美女被艹视频网站| 欧美aⅴ一区二区三区视频| 久久视频这里有精品| 亚洲无中文字幕| 日韩中文字幕一区| 日韩有码中文字幕在线| dy888夜精品国产专区| 久久三级毛片| 国产精品久久久久一区二区| 精品三级久久| 欧美激情免费视频| 老司机午夜在线| 中文字幕欧美亚洲| 国产一二三区在线视频| 三级在线看中文字幕完整版| 欧美四级电影网| 国产成人在线免费观看视频| 久久国产精品99精品国产 | 蜜臀久久久久久久| 成人免费观看视频在线观看| 在线精品一区| 91网站在线观看免费| 亚洲人成免费网站| 亚洲黄色成人久久久| 国产在视频线精品视频www666| 国产亚洲欧美一区二区| 亚洲国产中文在线二区三区免| 成人黄色av免费在线观看| 你懂得影院夜精品a| 欧洲s码亚洲m码精品一区| h片在线观看视频免费| 久久99亚洲热视| 在线欧美三级| 欧美成人亚洲成人| 亚洲综合影视| 久久久精品视频在线观看| 午夜在线播放| 久久久国产一区| 91网在线看| 欧美极品少妇与黑人| 欧美aaaxxxx做受视频| 欧美日韩成人精品| 国内老司机av在线| 久久久久久久久国产精品| 毛片网站在线看| 海角国产乱辈乱精品视频| 2020av在线| 欧美激情综合色综合啪啪五月| 欧美78videosex性欧美| 欧美国产中文字幕| 国产精品原创| 日本亚洲欧洲色α| 国产69精品久久久久9999人| 国产精品一区二区三区在线播放| 4438五月综合| 成人av中文| 日本欧美韩国国产| 日韩电影免费观看高清完整| 欧美疯狂party性派对| 三年中国中文在线观看免费播放 | 僵尸世界大战2 在线播放| 亚洲毛片播放| 黄色av免费在线播放| 另类综合日韩欧美亚洲| 国产在线a视频| 99久久综合精品| 熟女少妇内射日韩亚洲| 国产精品国产三级国产三级人妇 | 久久亚洲AV成人无码国产野外| 国产欧美视频在线观看| 女教师淫辱の教室蜜臀av软件| 亚洲精品高清在线观看| 国产精品久久久久久久妇| 欧美在线观看视频一区二区| 国产情侣在线播放| 精品一区二区三区三区| 日本激情在线观看| 国产69精品久久久| 成人黄色毛片| 国产精品视频500部| 欧美日韩老妇| 97超碰国产精品| 日本在线不卡视频| 日本道中文字幕| 中文字幕国产精品一区二区| 久久久久久久久久久网| 欧美在线免费播放| 亚洲av无码乱码国产精品| 亚洲日本中文字幕| 最新av在线播放| 国产精品免费视频xxxx| 亚洲视频国产精品| 天堂av一区二区| 亚洲高清激情| 中文字幕线观看| 久久网站热最新地址| 欧美人与禽zozzo禽性配| 色婷婷av一区| 欧美一级在线免费观看| 日韩中文字幕久久| 欧美色999| 精品乱子伦一区二区三区| 99精品在线| 99视频在线免费| 99在线视频精品| 欧美日韩在线观看成人| 欧美日韩亚洲不卡| 毛片在线能看| 91精品国产高清| 一区二区精彩视频| 欧洲美女和动交zoz0z| 蜜臀av国产精品久久久久| 中文字幕xxx| 精品日韩中文字幕| 免费观看成年人视频| 久久国产精品久久久久久久久久 | 欧美日韩国产首页| 国产特黄在线| 日本久久久久久| 欧美一区 二区| 欧美日韩成人免费视频| 成人精品电影在线观看| 久久久久久久久久网站| 3d动漫精品啪啪1区2区免费| 中文字幕在线视频区| 国产精品久久久久久久久粉嫩av| 色橹橹欧美在线观看视频高清| 精品少妇在线视频| 成人av网站在线观看免费| 久久这里只有精品国产| 欧美成人一区二区三区片免费| 麻豆视频在线免费观看| 91精品啪在线观看麻豆免费| 天天综合网网欲色| 热久久久久久久久| 亚洲欧洲国产日韩| 91片黄在线观看喷潮| 啊v视频在线一区二区三区| 欧美一级网址| 无码毛片aaa在线| 国产jizzjizz一区二区| 日韩欧美大片在线观看| 亚洲精品一二区| 日韩一区二区三区免费视频| 亚洲不卡中文字幕| 久久爱另类一区二区小说| 夫妻性生活毛片| 日韩欧美国产综合| 欧美卡一卡二| 久久国产主播精品| 日本欧洲一区二区| 后入内射无码人妻一区| 91麻豆精品国产91久久久| av片在线观看| 国产精品一区免费观看| 午夜在线精品偷拍| www..com.cn蕾丝视频在线观看免费版| 欧洲国内综合视频| www.欧美日本韩国| 国产精品久久精品国产| 亚洲一区二区成人| 色www亚洲国产阿娇yao| 欧美一级二级三级蜜桃| 丁香花电影在线观看完整版| 牛人盗摄一区二区三区视频| 奇米精品一区二区三区在线观看| 国产高潮流白浆| 亚洲国产欧美久久| 欧美xxxx做受欧美护士| 日本女人高潮视频| 99久久久免费精品国产一区二区| 91在线视频免费播放| 久久视频在线看| 亚洲成在人线免费观看| www.色欧美| 欧美日韩激情视频| 欧美激情办公室videoshd| 国产精品中出一区二区三区| 首页国产欧美日韩丝袜| 精品国产视频在线观看| 亚洲精品视频中文字幕| 精品中文字幕一区二区三区| 日本wwww视频| 亚洲日本电影在线| 欧美巨乳在线| 99久久99| 蜜桃一区二区三区四区| 成年人午夜视频| 久久精品这里热有精品| 九九综合久久|