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

Java筑基 - JNI到底是個啥

開發 后端
在前面介紹Unsafe的文章中,簡單的提到了java中的本地方法(Native Method),它可以通過JNI(Java Native Interface)調用其他語言中的函數來實現一些相對底層的功能,本文我們就來順藤摸瓜,介紹一下jni以及它的使用。

[[398657]]

在前面介紹Unsafe的文章中,簡單的提到了java中的本地方法(Native Method),它可以通過JNI(Java Native Interface)調用其他語言中的函數來實現一些相對底層的功能,本文我們就來順藤摸瓜,介紹一下jni以及它的使用。

首先回顧一下jni的主要功能,從jdk1.1開始jni標準就成為了java平臺的一部分,它提供的一系列的API允許java和其他語言進行交互,實現了在java代碼中調用其他語言的函數。通過jni的調用,能夠實現這些功能:

通常情況下我們一般使用jni用來調用c或c++中的代碼,在上一篇文章中我們用了下面的流程來描述了native方法的調用過程:

  1. Java Code -> JNI -> C/C++ Code 

但是準確的來說這一過程并不嚴謹,因為最終被執行的不是原始的c/c++代碼,而是被編譯連接后的動態鏈接庫。因此我們將這個過程從單純的代碼調用層面上進行升級,將jni的調用過程提高到了jvm和操作系統的層面,來加點細節進行一下完善:

看到這里,可能有的小伙伴就要提出疑問了,不是說java語言是跨平臺的嗎,這種與操作系統本地編譯的動態鏈接庫進行的交互,會不會使java失去跨平臺的可移植性?

針對這一問題,大家可以回想一下以前安裝jdk的經歷,在官網的下載列表中提供了各個操作系統的不同版本jdk,例如windows、linux、mac os版本等等,在這些jdk中,針對不同系統有著不同的jvm實現。而java語言的跨平臺性恰好是和它底層的jvm密不可分的,正是依靠不同的操作系統下不同版本jvm的“翻譯”工作,才能使編譯后的字節碼在不同的平臺下暢通無阻的運行。

在不同操作系統下,c/c++或其他代碼生成的動態鏈接庫也會有差異,例如在window平臺下會編譯為dll文件,在linux平臺下會編譯為so文件,在mac os下會編譯為jnilib文件。而不同平臺下的jvm,會“約定俗成”的去加載某個固定類型的動態鏈接庫文件,使得依賴于操作系統的功能可以被正常的調用,這一過程可以參考下面的圖來進行理解:

在對jni的整體調用流程有了一定的了解后,對于它如何調用其他語言中的函數這一過程,你是否也會好奇它是怎樣實現的,下面我們就通過手寫一個java程序調用c++代碼的例子,來理解它的調用過程。

1、準備java代碼

首先定義一個包含了native方法的類如下,之后我們要使用這個類中的native方法通過jni調用c++編寫成的動態鏈接庫中的方法:

  1. public class JniTest { 
  2.     static
  3.         System.loadLibrary("MyNativeDll"); 
  4.     } 
  5.  
  6.     public static native void callCppMethod(); 
  7.  
  8.     public static void main(String[] args) { 
  9.         System.out.println("DLL path:"+System.getProperty("java.library.path")); 
  10.         callCppMethod(); 
  11.     } 

在代碼中主要完成了以下工作:

在靜態代碼塊中,調用loadLibrary方法加載本地的動態鏈接庫,參數為不包含擴展名的動態鏈接庫庫文件名。在window平臺下會加載dll文件,在linux平臺下會加載so文件,在mac os下會加載jnilib文件

聲明了一個native方法,native關鍵字負責通知jvm這里調用方法的是本地方法,該方法在外部被定義

在main方法中,打印加載dll文件的路徑,并調用本地方法

2、生成頭文件

在使用c/c++來實現本地方法時,需要先創建.h頭文件。簡單的來說,c/c++程序通常由頭文件(.h)和定義文件(.c或.cpp)組成,頭文件包含了功能函數、數據接口的聲明,而定義文件用于書寫程序的實現。

在jdk8中可以直接使用javac -h指令生成c/c++語言中的頭文件。如果你使用的是較早版本的jdk,需要在執行javac編譯完成class文件后,再執行javah -jni生成c/c++風格的頭文件(在jdk10的新特性中已經刪除了javah這一指令)。我們使用的jdk8簡化了這一步驟,使其可以一步完成,在命令行窗口下執行命令:

  1. javac -h ./jni JniTest.java 

指令中使用 -h參數指定放置生成的頭文件的位置,最后的參數是java源文件的名稱。在這個過程中完成了兩件工作,首先生成class文件,其次在參數指定的目錄下生成頭文件。生成的頭文件com_cn_jni_JniTest.h內容如下:

  1. /* DO NOT EDIT THIS FILE - it is machine generated */ 
  2. #include <jni.h> 
  3. /* Header for class com_cn_jni_JniTest */ 
  4.  
  5. #ifndef _Included_com_cn_jni_JniTest 
  6. #define _Included_com_cn_jni_JniTest 
  7. #ifdef __cplusplus 
  8. extern "C" { 
  9. #endif 
  10. /* 
  11.  * Class:     com_cn_jni_JniTest 
  12.  * Method:    callCppMethod 
  13.  * Signature: ()V 
  14.  */ 
  15. JNIEXPORT void JNICALL Java_com_cn_jni_JniTest_callCppMethod 
  16.   (JNIEnv *, jclass); 
  17.  
  18. #ifdef __cplusplus 
  19. #endif 
  20. #endif 

生成的頭文件和大家熟悉的 java接口有些相似,只有函數的聲明而沒有具體實現。簡單的解釋一下頭文件中的代碼:

  • extern "C"告訴編譯器,這部分代碼使用C語言規則來進行編譯
  • JNIEXPORT和JNICALL是jni中定義的兩個宏,使用JNIEXPORT支持在外部程序代碼中調用該動態庫中的方法,使用JNICALL定義函數調用時參數的入棧出棧約定
  • 函數名稱由包名+類名+方法名組成,在該方法中有兩個參數,通過第一個參數JNIEnv *的對象可以調用jni.h中封裝好的大量函數 ,第二個參數代表著native方法的調用者,當java代碼中定義的native方法是靜態方法時這里的參數是jclass,非靜態方法的參數是jobject

接下來我們創建一個cpp文件,引用頭文件并實現其中的函數,也就是native方法將要實際執行的邏輯:

  1. #include "com_cn_jni_JniTest.h" 
  2. #include <stdio.h> 
  3.   
  4. JNIEXPORT void JNICALL Java_com_cn_jni_JniTest_callCppMethod 
  5.   (JNIEnv *, jclass) 
  6.     printf("Print From Cpp: \n"); 
  7.     printf("I am a cpp method ! \n"); 

在方法的實現中加入簡單的printf打印語句,在完成方法的實現后,我們需要將上面的cpp文件編譯為動態鏈接庫,提供給java中的native方法調用,因此下面需要在window環境下安裝gcc環境。

3、gcc環境安裝

在window環境下,如果你不希望為了生成一個dll就去下載體積龐大的的Visual Studio的話,MinGW是一個不錯的選擇,簡單的說它就是一個windows版本下的gcc。那么估計有的同學又要問了,gcc是什么?簡單的來說就是linux系統下C/C++的編譯器,通過它可以將源代碼編譯成可執行程序。首先從下面的網址下載mingw-get-setup的安裝程序:

  1. http://sourceforge.net/projects/mingw/  #32位 
  2. https://sourceforge.net/projects/mingw-w64/  #64位 

需要注意,一定要按照系統位數安裝對應的版本,否則后面生成的dll在運行時就可能會因位數不匹配而報錯,我在實驗的過程中第一次就錯誤安裝了32位的MinGw,導致了在程序運行過程中報了下面錯誤:

  1. Exception in thread "main" java.lang.UnsatisfiedLinkError:  
  2. F:\Workspace20\unsafe-test\src\main\java\com\cn\jni\jni\MyNativeDll.dll:  
  3. Can't load IA 32-bit .dll on a AMD 64-bit platform 

安裝完成后,將MinGW\bin目錄加入系統環境變量PATH,輸入下面的指令測試gcc是否可以使用:

  1. gcc -v 

如果能夠正常輸出gcc的版本信息,說明gcc安裝成功:

在測試的過程中發現,如果安裝的是64位的mingw,那么在安裝完成后gcc就已經直接可以可用。但是如果安裝的是32位的mingw,需要使用下面的命令單獨安裝gcc:

  1. mingw-get install gcc 

gcc安裝完成后,如果還想安裝gdb或make等其他指令進行調試或編譯,同樣可以使用強大的mingw-get命令進行獨立安裝。

4、生成動態鏈接庫

在gcc環境準備好的條件下,接下來使用下面的命令生成dll動態鏈接庫:

  1. gcc -m64 -Wl,--add-stdcall-alias -I"D:\Program Files\Java\jdk1.8.0_261\include"  
  2. -I"D:\Program Files\Java\jdk1.8.0_261\include\win32"  
  3. -shared -o MyNativeDll.dll JniTestImpl.cpp 

簡單的解釋一下各個參數的含義:

  • -m64 :將cpp代碼編譯為64位的應用程序
  • -Wl,--add-stdcall-alias:-Wl表示將后面的參數傳遞給連接程序,參數--add-stdcall-alias表示帶有標準調用后綴@NN的符號會被剝掉后綴后導出
  • -I:指定頭文件的路徑,在生成的頭文件代碼中引入的jni.h就在這個目錄下
  • -shared:指定生成動態鏈接庫,如果不使用這個標志那么外部程序將無法連接
  • -o:指定目標的名稱,這里將生成的動態鏈接庫命名為MyNativeDll.dll
  • JniTestImpl.cpp:被編譯的源程序文件名

在指令的執行過程中,都做了什么事呢,可以參考下面這張圖:

在執行過程中,以.cpp源代碼和.h頭文件作為源文件,先進行了預處理、編譯、匯編的操作,圖中省略了這一階段產生的一些中間文件,編譯完成后生成的.o二進制文件相對重要,依賴這個文件,最終生成動態鏈接庫。

在執行了上面的指令后,就會在當前目錄下生成一個MyNativeDll.dll文件,再運行之前準備好的java代碼:

程序報錯,這是因為在默認的載入庫文件的目錄下沒有找到我們的dll文件。有兩種方式可以解決:

直接將dll文件拷貝到默認的加載目錄下,具體的路徑可以通過System.getProperty("java.library.path")獲取,該方法可能會獲得多個目錄,放在任意一個目錄下即可

是在VM Option中修改啟動參數,指定dll的存放目錄:

  1. -Djava.library.path=F:\Workspace20\unsafe-test\src\main\java\com\cn\jni\jni 

再次執行,輸出結果:

  1. DLL path:F:\Workspace20\unsafe-test\src\main\java\com\cn\jni\jni 
  2. Print From Cpp:  
  3. I am a cpp method ! 

可以看到程序加載dll的路徑已經切換成了它的存放路徑,并且通過jni調用成功,輸出了在c++中的代碼邏輯。可以用下面的圖來總結上面實現jni調用的過程:

在對jni的調用有了一個整體的了解后,如果大家對代理模式比較熟悉的話,也可以從代理模式的角度來理解jni,將jni調用過程中的各個角色帶入到代理模式中:

  • 代理角色:包含native方法的jni類
  • 實現角色:c/c++或其他語言實現的動態鏈接庫
  • 客戶端:調用native方法的java類程序
  • 接口(抽象角色):在jni中接口這一角色的存在感相對薄弱,因為jni是跨語言的,所以說無法嚴格的定義一個接口并讓它同時應用于java和其他語言。但是通過生成的.h頭文件,在一定程度上實現了從接口規范上統一了java中native方法和其他語言中的函數

以代理模式的概述圖來進行描述:

上圖在標準代理模式的基礎上做了一些修改以便于理解,因為這里的接口只做規范約束作用,所以讓客戶端的調用過程跳過了接口,直接指向了代理角色,再由代理角色調用實現角色完成功能的調用。總的來說,jni起到了一個代理或中介的作用,與常見代理不同的是這里只做方法的調用,而不實現邏輯上的增強。通過這一模式,向java程序員隱藏了底層c/c++代碼的實現細節,讓我們專注于業務代碼的編寫即可。

總結

在前面對native方法有了一定了解的基礎上,本文介紹了jni的相關知識。通過本文的學習,有助于我們:

 

  • 理解java的為何能夠做到跨平臺,以及依賴操作系統的底層操作是如何實現的
  • 了解native方法的調用過程,在必要時可以自己實現jni類接口調用
  • 回顧一些C/C++知識
  • 當然了,使用jni也會帶來一些缺點:
  • 當在某個操作系統下使用了jni標準,將本地代碼編譯生成了動態鏈接庫后,如果要將這個程序移植到其他操作系統,需要在新的平臺重新編譯代碼生成動態鏈接庫
  • 對其他語言的不正確使用可能會造成程序出現錯誤,例如之前提到的使用c語言進行內存操作時未及時回收內存可能引起的內存泄漏
  • 對其他語言的依賴過高,會提高了java和其他語言的耦合性,也提高了對項目代碼的維護成本

本文轉載自微信公眾號「碼農參上」,可以通過以下二維碼關注。轉載本文請聯系碼農參上公眾號。

 

責任編輯:武曉燕 來源: 碼農參上
相關推薦

2025-10-31 00:00:02

硅光光通信英偉達

2025-10-29 07:33:13

2024-02-07 12:35:00

React并發模式concurrent

2022-05-04 08:38:32

Netty網絡框架

2021-01-28 17:41:32

Github網站Pull Reques

2022-04-10 19:26:07

TypeScript類型語法

2024-07-12 15:08:23

Python@wraps函數

2024-08-26 14:23:56

2024-08-01 17:34:56

Promiseaxios請求

2021-12-16 15:11:59

Facebook天秤幣加密貨幣

2021-12-26 00:01:51

Log4Shell漏洞服務器

2022-09-06 21:38:45

數字人數字孿生

2013-05-29 10:17:56

Hadoop分布式文件系統

2012-07-25 09:09:46

GNOME OS桌面

2020-03-07 09:47:48

AVL樹算法場景

2020-10-29 07:03:56

Docker容器存儲

2024-02-01 20:15:37

2024-02-26 00:00:00

人工智能序列數據機器人

2021-12-16 21:13:38

通信網管平臺

2025-05-28 00:30:00

MCP智能體Agent
點贊
收藏

51CTO技術棧公眾號

久久久国产精品成人免费| 妺妺窝人体色www在线小说| 国产强被迫伦姧在线观看无码| 欧美在线1区| 亚洲国产精久久久久久 | 亚洲字幕久久| 精品福利av导航| 成人精品小视频| 超碰在线无需免费| 99久久免费精品高清特色大片| 国产不卡视频在线| 波多野结衣家庭教师| 亚洲69av| 日韩女优视频免费观看| 能看的毛片网站| 欧美日韩色网| 国产精品免费视频观看| 国产一区二区三区黄| 色综合色综合色综合色综合| 天天干天天综合| 岛国在线大片| 99热在这里有精品免费| 亚洲精品欧美一区二区三区| 日韩综合在线观看| 在线播放一区| 美女av一区二区| 阿v天堂2014| 亚洲亚洲免费| 亚洲国产精品久久久久秋霞蜜臀 | 成人女同在线观看| 国产精品久久二区二区| 久久精品丝袜高跟鞋| 99在线观看免费| 久久精品国产99国产精品| 欧美在线中文字幕| 激情综合网五月婷婷| 亚洲国产一区二区三区在线播放| 伊人精品在线观看| 欧美图片一区二区| 日韩高清影视在线观看| 精品国产一二三区| 91精品人妻一区二区三区四区| 亚洲国产天堂| 欧美区一区二区三区| 一本久道综合色婷婷五月| 日韩电影免费看| 午夜激情一区二区三区| 成人欧美一区二区三区白人| 午夜精品在线观看| 精品无码av在线| 国内精品亚洲| 欧美丰满少妇xxxx| 精品一级少妇久久久久久久| 亚洲午夜电影| 97精品伊人久久久大香线蕉 | 亚洲动漫第一页| japanese在线播放| 欧美色图天堂| 亚洲国产精品久久人人爱蜜臀 | 日本不卡影院| 一区二区三区中文字幕在线观看| 国产又粗又爽又黄的视频| 91九色在线porn| 国产精品久久久久久久久久免费看| 日韩av高清在线播放| 国产精品天堂| 国产精品美女一区二区在线观看| 中文字幕中文字幕一区三区| 成人短视频在线| 亚洲一区在线视频| 久草视频这里只有精品| 国产精品13p| 色呦呦一区二区三区| 欧美三级午夜理伦三级| 成人看片毛片免费播放器| 精品视频999| 国产精品久久久久久久99| 亚洲国产一区二区三区网站| 色呦呦在线免费观看| 国产夜色精品一区二区av| 亚洲国产精品久久久久久女王| 欧美高清视频| 亚洲高清免费观看| 精品视频一区二区在线| 亚洲三级电影| 亚洲国产精品成人精品| av网站免费在线看| 亚洲最大av| 68精品久久久久久欧美| 一区二区三区在线免费观看视频| 国产在线精品免费| 久久久久成人精品免费播放动漫| 9191在线观看| 亚洲成人免费观看| 91国产精品视频在线观看| 日本一区二区三区电影免费观看| 日韩电影中文字幕一区| 午夜精品一区二区三级视频| 在线不卡欧美| 国产日产久久高清欧美一区| 亚洲精品国产片| 中文字幕国产一区| 久久亚洲国产成人精品无码区| videos性欧美另类高清| 91精品国产免费| 欧美色图亚洲激情| 欧美韩日精品| 国产精品男女猛烈高潮激情| 国精产品乱码一区一区三区四区| 日本一区二区不卡视频| 夜夜添无码一区二区三区| 国产成人福利夜色影视| 亚洲国产精品一区二区久| 91九色丨porny丨极品女神| 久久久久一区| 国产一区二区高清视频| 好操啊在线观看免费视频| 欧美性猛交xxxx偷拍洗澡| 色综合久久久无码中文字幕波多| 日韩国产专区| 欧美怡春院一区二区三区| www.日日夜夜| 亚洲婷婷国产精品电影人久久| 少妇性饥渴无码a区免费| 51精品国产| 久久精品国产亚洲精品| 91久久国产综合久久91| jiyouzz国产精品久久| 国产美女视频免费| 色综合视频一区二区三区日韩| 精品亚洲一区二区三区在线播放| 麻豆影视在线播放| 精品亚洲国产成人av制服丝袜 | 能看毛片的网站| 日韩情爱电影在线观看| 国产精品久久久久久av| 青青青手机在线视频观看| 亚洲成a人在线观看| 欧美视频亚洲图片| 亚洲乱码在线| 96sao精品视频在线观看| 欧美尤物美女在线| 欧美精品一二三四| 成年人二级毛片| 九一九一国产精品| 中文字幕日韩精品一区二区| 国产精品字幕| 日韩中文字幕在线视频播放| 91好色先生tv| 亚洲人被黑人高潮完整版| 久久精品国产99久久99久久久| 亚洲国产精品久久久天堂| 国产在线精品成人一区二区三区| 91社区在线| 91精品午夜视频| 国产大片免费看| 国产wwwwxxxx| 亚洲精选久久| 美女黄毛**国产精品啪啪| 中文字幕影音在线| 亚洲天堂av在线播放| 这里只有精品国产| 中文字幕中文字幕一区二区 | 国产原创一区| 日韩在线观看免费全| 国产精品人人妻人人爽| 亚洲欧美电影一区二区| 亚洲黄色小说在线观看| 亚洲福利免费| 日本一区二区三区四区在线观看| 123成人网| 久久久精品久久久久| www.久久伊人| 欧美性猛交丰臀xxxxx网站| 99精品欧美一区二区| 狠狠久久亚洲欧美| 欧美一级欧美一级| 妖精一区二区三区精品视频| 国产精品久久久久久搜索| 成人影院在线观看| 精品国产三级电影在线观看| 国产成人无码一区二区在线播放| 国产欧美日韩一区二区三区在线观看| 国产乱女淫av麻豆国产| 激情综合视频| 亚洲激情电影在线| 澳门精品久久国产| 国产成人一区二区三区| 麻豆传媒在线观看| 亚洲成人黄色在线| 国产一级片一区二区| 亚洲精品videosex极品| 美国黄色一级毛片| 国产在线精品一区二区不卡了| 国产日韩亚洲欧美综合| 国产精品一线二线三线| jlzzjlzz亚洲女人| 国产精品三区在线| 国产精成人品2018| 亚洲91精品在线| 精品51国产黑色丝袜高跟鞋| 日韩不卡中文字幕| 国产日韩在线观看一区| 一本久道久久综合中文字幕| 欧美色图亚洲视频| 国产午夜亚洲精品理论片色戒| www.污网站| 日韩国产在线观看| 和岳每晚弄的高潮嗷嗷叫视频| 波多野结衣在线播放一区| 国产精品香蕉视屏| 99精品在线免费观看| 国产成人91久久精品| 97久久人人超碰caoprom| 日韩在线免费观看视频| 麻豆影视在线| 亚洲国产一区二区三区四区| av中文字幕观看| 欧美亚洲综合色| caoporn国产| 亚洲成人免费视频| 免费在线视频观看| 亚洲欧洲一区二区三区| 一色道久久88加勒比一| 99久久精品国产一区二区三区| 亚洲女人在线观看| 青青草国产成人99久久| 超碰网在线观看| 国产精品美女久久久浪潮软件| 99久热在线精品视频| 99视频精品全部免费在线视频| 欧美一区三区二区在线观看| 久久久久97| 国产精品亚洲不卡a| ccyy激情综合| 国产精品美女久久久久av福利| 精品国产三区在线| 成人激情视频网| 国产一级黄色av| 99re6这里只有精品| 欧美一区1区三区3区公司 | 国产电影一区在线| 欧美一级小视频| 精品一区二区三区香蕉蜜桃| mm131亚洲精品| 久久精品99国产精品| 五月婷婷六月合| 久久99国产精品成人| 色啦啦av综合| 国产一区二区三区av电影| 日本中文字幕二区| 国产精品一区二区在线播放| 亚洲一区二区偷拍| 国产成人免费在线| 日韩综合第一页| 97se狠狠狠综合亚洲狠狠| 疯狂揉花蒂控制高潮h| 久久综合999| 少妇精品无码一区二区免费视频| 国产精品亲子伦对白| 欧美日韩午夜视频| 亚洲主播在线观看| 国产一区二区三区影院| 日本丶国产丶欧美色综合| 18国产免费视频| 91精品视频网| 四虎永久在线观看| 亚洲欧美中文在线视频| 91官网在线| 久久97精品久久久久久久不卡| 日本成人不卡| 国产成人短视频| av一级久久| 国产伦视频一区二区三区| 亚洲尤物av| 日韩免费高清av| 欧美不卡在线播放| 99在线|亚洲一区二区| 99视频在线视频| 国产精品亚洲第一| 精品夜夜澡人妻无码av| 国产精品久久久久久亚洲毛片| 私库av在线播放| 日韩欧美国产成人| 国产三级在线观看视频| 日韩精品视频在线观看网址 | 国产精品三级久久久久三级| 午夜国产福利一区二区| 精品av在线播放| 亚洲最大成人在线视频| 亚洲国产又黄又爽女人高潮的| 日韩久久不卡| 日本免费一区二区视频| 欧美 日韩 国产在线| 久久久久久久久久久9不雅视频| 国产原创中文在线观看| 久久精品久久精品| 国产偷人妻精品一区| 中文字幕一区二区三区乱码在线| 国产精品第九页| 欧美日本乱大交xxxxx| 五月婷婷伊人网| 久久国产精品电影| 素人啪啪色综合| 国产三区二区一区久久| 国产精品久久久久久久久妇女| 久久久久久久久久久久久国产精品| 国产在线不卡视频| 国产一区二区三区精品在线| 亚洲二区视频在线| 国产成人免费看一级大黄| 正在播放国产一区| 中国色在线日|韩| av一区观看| 久久久久久久久久久妇女| 天堂av在线网站| 久久一二三国产| 国产亚洲精品av| 91精品在线麻豆| 日本精品在线| 国产精品r级在线| 亚洲v天堂v手机在线| 无码 制服 丝袜 国产 另类| 国产精品夜夜爽| 免费观看特级毛片| 欧美性大战xxxxx久久久| 欧洲免费在线视频| 18久久久久久| 清纯唯美亚洲经典中文字幕| 又大又硬又爽免费视频| 国产精品中文字幕欧美| 欧美视频www| 91麻豆精品国产91久久久更新时间| 成人全视频高清免费观看| 国产99在线|中文| 亚洲第一福利专区| 国产精品无码专区av在线播放 | 青草青在线视频| 91在线观看免费| 一区二区三区在线电影| 久久婷婷中文字幕| 日韩美女视频19| 国产伦精品一区二区三区四区 | 91资源在线观看| 国产精品久久久久久久久婷婷 | 国产精品美女一区二区三区| 中文字幕日产av| 久久精品视频一| 9999精品视频| 8x8x华人在线| 国产成人免费在线观看| 国产一级特黄aaa大片| 日韩成人中文字幕在线观看| 在线最新版中文在线| 欧洲亚洲一区二区| 美女任你摸久久| 国产高潮流白浆| 精品国产乱码久久久久久浪潮| 91破解版在线观看| 欧美日韩一区二| 久久99精品久久只有精品| 东方av正在进入| 欧美精品一区二区蜜臀亚洲| 亚洲欧美小说色综合小说一区| 久久久婷婷一区二区三区不卡| 久久久亚洲人| 99热6这里只有精品| 日韩午夜小视频| 牛牛精品一区二区| 亚洲高清在线播放| 国产一区日韩二区欧美三区| 久久黄色小视频| 亚洲精品自拍视频| 国产成+人+综合+亚洲欧美| 欧美另类videos| av在线一区二区| 亚洲午夜无码久久久久| 欧美成人免费视频| 精品欧美午夜寂寞影院| 成人免费在线观看视频网站| 1区2区3区国产精品| 天天操天天舔天天干| 国产成人小视频在线观看| 欧美激情亚洲| 精品无码国产污污污免费网站| 欧美一区日本一区韩国一区| 三妻四妾完整版在线观看电视剧| 亚洲人成网站在线观看播放| 国产成人欧美日韩在线电影| 无码人妻丰满熟妇精品区| 久久成人国产精品| 色棕色天天综合网| 亚洲av无码久久精品色欲| 色噜噜狠狠一区二区三区果冻| 91网址在线观看| 欧美日韩精品综合| 成人妖精视频yjsp地址| 亚洲一卡二卡在线| 人体精品一二三区| 欧美色图麻豆|