精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产成人av一区二区三区| 日韩在线资源网| 狠狠干 狠狠操| 青青草在线免费观看| 日韩精品成人一区二区在线| 最新国产成人av网站网址麻豆| 国产九九九视频| 超碰中文在线| 国产精品视频第一区| 99porn视频在线| 亚洲黄网在线观看| 欧美激情综合| 尤物tv国产一区| 国产免费无码一区二区| 三级成人在线| 无码av中文一区二区三区桃花岛| 亚洲黄色成人久久久| 日本韩国免费观看| 麻豆成人在线观看| 2019中文在线观看| 天天鲁一鲁摸一摸爽一爽| 欧美一区自拍| 日韩女优电影在线观看| 国产成人精品无码播放| av在线导航| 日本一区二区免费在线观看视频 | 激情不卡一区二区三区视频在线 | 日av中文字幕| h片在线观看视频免费| 亚洲私人黄色宅男| 日本精品视频一区| 婷婷五月综合久久中文字幕| 国产精品一区久久久久| 国产精品96久久久久久又黄又硬| www.99re7.com| 午夜精品久久99蜜桃的功能介绍| 在线观看成人黄色| 国产美女免费无遮挡| 欧美sss在线视频| 欧美xxxxx牲另类人与| 一级淫片在线观看| 精品久久在线| 欧美日韩精品一区视频| 久草在在线视频| 97se综合| 91久久精品一区二区| 国产肥臀一区二区福利视频| 国产99在线观看| 亚洲国产精品影院| www.国产在线视频| 51av在线| 五月天国产精品| 尤物av无码色av无码| 国内小视频在线看| 亚洲福利电影网| 日韩欧美精品免费| 免费一二一二在线视频| 丰满岳妇乱一区二区三区| av高清在线免费观看| freexxx性亚洲精品| 五月婷婷激情综合网| 极品美女扒开粉嫩小泬| 一本大道色婷婷在线| 色综合中文字幕| 成人免费xxxxx在线视频| 忘忧草在线www成人影院| 日本高清不卡aⅴ免费网站| 91蝌蚪视频在线观看| 亚洲电影有码| 91精品免费观看| ass极品水嫩小美女ass| 果冻天美麻豆一区二区国产| 亚洲第一中文字幕在线观看| 男男做爰猛烈叫床爽爽小说| 国产精品亚洲二区| 色偷偷av一区二区三区乱| 欧美h片在线观看| 欧美日韩国产精品一区二区亚洲| 国模gogo一区二区大胆私拍| 青青草免费观看视频| 欧美aaa在线| 91久久久久久久一区二区| 丰满人妻一区二区三区无码av | 欧美日韩mp4| 深夜视频在线观看| 久久av综合| 久久久精品999| 亚洲国产精品午夜在线观看| 快she精品国产999| 亚洲一区中文字幕| 天堂v视频永久在线播放| 中文字幕av一区二区三区高| 中文字幕乱码免费| 26uuu亚洲电影| 91精品国产欧美一区二区成人| 漂亮人妻被黑人久久精品| 精品av一区二区| 久久成人精品视频| 国产精品777777| 国产一区二区三区美女| 国产尤物91| 欧美成人视屏| 欧美性猛交xxxx免费看漫画| 亚洲激情在线看| 午夜先锋成人动漫在线| 成人444kkkk在线观看| 九九热精品视频在线| 国内精品国产成人| 欧美日韩国产综合视频在线| 人人超在线公开视频| 欧美在线免费播放| 91人人澡人人爽| 99国产**精品****| 青草热久免费精品视频| 亚洲高清视频在线播放| 国产精品天干天干在线综合| 欧美日韩性生活片| 日韩精品视频中文字幕| 中日韩午夜理伦电影免费| 日韩污视频在线观看| 国产一区999| 午夜欧美性电影| 高清不卡av| 亚洲国语精品自产拍在线观看| 欧美黑人性猛交xxx| 日韩精品五月天| 久久国产精品高清| 51漫画成人app入口| 日韩写真欧美这视频| 殴美一级黄色片| 玖玖在线精品| 日韩av高清| 日本免费久久| 国产丝袜一区二区| 好看的av在线| bt7086福利一区国产| 成年女人18级毛片毛片免费| 免费看日产一区二区三区| 色偷偷888欧美精品久久久| 天堂免费在线视频| 久久精品亚洲麻豆av一区二区 | 日韩亚洲不卡在线| 免费福利视频一区二区三区| 日韩精品欧美国产精品忘忧草 | 好吊日在线视频| 麻豆国产91在线播放| 亚洲一区二区在线免费观看| 国产精成人品2018| 伊人av综合网| 中文无码精品一区二区三区 | 国产色无码精品视频国产| 久久草av在线| 中国一级黄色录像 | 另类小说综合网| 九色porny视频在线观看| 亚洲国产精品久久91精品| www.天天色| 91丨九色丨蝌蚪丨老版| 国产日韩一区二区在线| 九九在线高清精品视频| 国产精品久久久久久久app| 粉嫩一区二区三区国产精品| 欧美日韩一区二区三区四区| 99精品中文字幕| 国产精品亚洲а∨天堂免在线| 日韩精品手机在线观看| 国内视频在线精品| 国产91色在线免费| 亚洲成人三级| 日韩欧美一级片| 国产又黄又粗又爽| 欧美国产日韩一二三区| 手机免费av片| 国精品一区二区| 日韩.欧美.亚洲| www.久久爱.com| 久久久久久久久久国产| 色视频在线观看| 欧美日韩夫妻久久| 国产网友自拍视频| 国产日韩欧美激情| 亚洲三级在线视频| 乱码第一页成人| 在线视频福利一区| 久久电影在线| 国产日韩精品在线观看| gogo久久| 中文字幕久久久| 人成网站在线观看| 欧美亚洲日本国产| 国产在线观看99| 国产欧美视频一区二区| 国产sm在线观看| 宅男噜噜噜66一区二区| 亚洲一区三区电影在线观看| 女同久久另类99精品国产| 国产精品一区久久| 高清在线视频不卡| 久久亚洲春色中文字幕| 天堂在线视频观看| 555www色欧美视频| 亚洲欧美一区二区三区在线观看| 最新欧美精品一区二区三区| 一区二区不卡免费视频| 国产一区二区三区在线观看免费视频 | 国产免费一区二区三区在线观看| gogo高清在线播放免费| 久久精视频免费在线久久完整在线看 | 另类小说一区二区三区| 久久国产精品视频在线观看| 国产精品久久久久久| 欧美日韩精品久久| 欧美美女啪啪| 亚洲尤物视频网| av亚洲一区| 欧美中文在线观看国产| 美足av综合网| 久久香蕉国产线看观看av| 久久精品国产亚洲a∨麻豆| 精品日韩一区二区| 国产欧美一级片| 欧美日韩你懂得| 草莓视频18免费观看| 午夜精品一区在线观看| 国精品人伦一区二区三区蜜桃| 26uuu亚洲综合色| 国产+高潮+白浆+无码| 国产一区二区h| 伊人五月天婷婷| 麻豆精品视频在线观看| 手机在线看福利| 久久综合婷婷| 美女福利视频在线| 国产情侣一区| 免费观看日韩毛片| 国产乱码精品| 91九色在线观看视频| 99热免费精品| 日本福利视频一区| 亚洲第一精品影视| 欧美视频在线免费播放| 亚洲免费播放| 人妻熟妇乱又伦精品视频| 激情婷婷久久| 欧美日韩黄色一级片| 日韩一级在线| www.亚洲天堂网| 媚黑女一区二区| 国产视频一区二区视频| 日韩国产精品大片| 欧美日韩在线观看不卡| 奇米888四色在线精品| 国产三级三级看三级| 免费人成精品欧美精品| 91香蕉视频导航| 久久精品国产亚洲a| 午夜av中文字幕| 国产精品12区| 黄色网址在线视频| 久久蜜桃av一区精品变态类天堂| 精品国产av无码| 欧美国产禁国产网站cc| 麻豆一区在线观看| 一区二区三区成人| 黄色片视频网站| 色婷婷av久久久久久久| 亚洲一区二区影视| 日韩无一区二区| 神宫寺奈绪一区二区三区| 日韩精品高清在线观看| 国产系列在线观看| 久久久av网站| cao在线视频| 国产精品综合久久久| 韩国一区二区三区视频| 蜜桃久久影院| 99久久夜色精品国产亚洲狼 | 污片在线免费观看| 91精品国产91久久久久久不卡 | 欧美日韩一区二区高清| 欧美日韩国产精品激情在线播放| 奇米色一区二区| 亚洲国产精品第一页| 国产婷婷色一区二区三区四区 | 极品少妇一区二区三区| 99精品免费在线观看| 麻豆国产欧美日韩综合精品二区| 日本一级大毛片a一| 国产欧美中文在线| 免费在线看黄网址| 91久久精品一区二区| 亚洲第一大网站| 尤物九九久久国产精品的特点| 中文字幕资源网在线观看| 欧美在线视频观看| 蜜桃精品一区二区三区| 日本不卡久久| 狠狠干成人综合网| 性猛交ⅹ×××乱大交| av色综合久久天堂av综合| 亚洲图片第一页| 精品久久久久久久大神国产| 亚洲香蕉在线视频| 亚洲精品在线看| 青草在线视频| 国产欧洲精品视频| 五月天亚洲一区| 日韩精品一区二区免费| 久久精品久久综合| 日韩av在线看免费观看| 亚洲大片免费看| 国产乱人乱偷精品视频a人人澡| 亚洲人成在线观| 91美女主播在线视频| 147欧美人体大胆444| 成人精品电影| 久久精品一区二| 91在线观看下载| 激情综合网五月婷婷| 欧美一区二区三区免费| 95在线视频| 国产精品福利在线观看| 色狼人综合干| 免费看日本毛片| yourporn久久国产精品| 国产波霸爆乳一区二区| 欧美精品777| 中文字幕在线播放| 日本视频久久久| 亚洲免费观看高清完整版在线观| 国产91沈先生在线播放| 国产伦理精品不卡| 天天操夜夜操av| 欧美男人的天堂一二区| 男人影院在线观看| 国产区亚洲区欧美区| 欧美gayvideo| 五月天婷婷亚洲| 最新日韩在线视频| 国产精品一区二区人人爽| 久久激情视频免费观看| **精品中文字幕一区二区三区| 亚洲一卡二卡三卡| 国产资源精品在线观看| 日本一级片免费| 欧美一区二区在线播放| 菠萝菠萝蜜在线视频免费观看 | 欧美理伦片在线播放| 亚洲 高清 成人 动漫| 91理论电影在线观看| 国语对白永久免费| 伊人久久免费视频| 成人午夜毛片| 久久免费视频2| 国产成人一区在线| 久久久久成人网站| 亚洲精品狠狠操| 性高爱久久久久久久久| 亚洲国产一区二区三区在线播| 久久精品国产亚洲高清剧情介绍 | 91黄色激情网站| 91看片在线观看| 亚洲一区二区三区777| 激情欧美一区二区三区| 久久无码人妻精品一区二区三区| 一本大道久久a久久精二百 | 久久久久久欧美| 噜噜噜天天躁狠狠躁夜夜精品 | 成人动漫视频在线| 国产又大又黄又粗| 自拍亚洲一区欧美另类| 日本免费精品| jizzjizzxxxx| 中文字幕一区二区不卡| 亚洲欧美另类日韩| 国产精品成人免费电影| 亚洲国产精品久久久久蝴蝶传媒| 成人一区二区三区仙踪林| 精品福利在线视频| 成人精品一区二区三区免费| 51成人做爰www免费看网站| 国产亚洲精品v| 免费成人深夜夜行网站| 亚洲国产精品va在线| 欧亚一区二区| 国产 国语对白 露脸 | 日产精品高清视频免费| 韩日av一区二区| 你懂的国产在线| 欧美理论电影在线播放| 蜜乳av综合| 免费人成视频在线播放| 日本精品一区二区三区高清| 成视频免费观看在线看| 久久久99爱| 国产精品123| 国产精品无码粉嫩小泬| 国内自拍欧美激情| 日韩一区三区| 黄色正能量网站|