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

使用JNI進行混合編程:在C/C++中調用Java代碼

開發 后端
JNI就是Java Native Interface, 即可以實現Java調用本地庫, 也可以實現C/C++調用Java代碼, 從而實現了兩種語言的互通, 可以讓我們更加靈活的使用。

JNI就是Java Native Interface, 即可以實現Java調用本地庫, 也可以實現C/C++調用Java代碼, 從而實現了兩種語言的互通, 可以讓我們更加靈活的使用。

通過使用JNI可以從一個側面了解Java內部的一些實現。

本文使用的環境是:

  1. 64位的win7系統
  2. JDK 1.6.0u30 (32位)
  3. C/C++編譯器是 Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 (VC 6.0的, 其他版本的也可以編譯通過, 測試過vs2010)

本文使用到的一些功能:

  1. 創建虛擬機
  2. 尋找class對象, 創建對象
  3. 調用靜態方法和成員方法
  4. 獲取成員屬性, 修改成員屬性

C/C++調用Java代碼的一般步驟:

  1. 編寫Java代碼, 并編譯
  2. 編寫C/C++代碼
  3. 配置lib進行編譯, 配置PATH添加相應的dll或so并運行

編寫Java代碼并編譯

這段代碼非常簡單, 有個靜態方法和成員方法, 一個public的成員變量

  1. public class Sample2 {  
  2.     public String name;  
  3.        
  4.     public static String sayHello(String name) {  
  5.         return "Hello, " + name + "!";  
  6.     }  
  7.        
  8.     public String sayHello() {  
  9.         return "Hello, " + name + "!";  
  10.     }  

由于沒有定義構造函數, 所以會有一個默認的構造函數.

運行下面的命令編譯

>javac Sample2.java 

 可以在當前目錄下看到Sample2.class文件, 編譯成功, ***步完成了, So easy!

可以查看Sample2類中的簽名

>javap -s -private Sample2 

結果如下

  1. Compiled from "Sample2.java" 
  2. public class Sample2 extends java.lang.Object{  
  3. public java.lang.String name;  
  4.   Signature: Ljava/lang/String;  
  5. public Sample2();  
  6.   Signature: ()V  
  7. public static java.lang.String sayHello(java.lang.String);  
  8.   Signature: (Ljava/lang/String;)Ljava/lang/String;  
  9. public java.lang.String sayHello();  
  10.   Signature: ()Ljava/lang/String;  

關于簽名的含義, 請參看使用JNI進行Java與C/C++語言混合編程(1)--在Java中調用C/C++本地庫.

編寫C/C++代碼調用Java代碼

先貼代碼吧

  1. #include <jni.h>  
  2. #include <string.h>  
  3. #include <stdio.h>  
  4.    
  5. // 環境變量PATH在windows下和linux下的分割符定義  
  6. #ifdef _WIN32  
  7. #define PATH_SEPARATOR ';' 
  8. #else 
  9. #define PATH_SEPARATOR ':' 
  10. #endif  
  11.    
  12.    
  13. int main(void)  
  14. {  
  15.     JavaVMOption options[1];  
  16.     JNIEnv *env;  
  17.     JavaVM *jvm;  
  18.     JavaVMInitArgs vm_args;  
  19.        
  20.     long status;  
  21.     jclass cls;  
  22.     jmethodID mid;  
  23.     jfieldID fid;  
  24.     jobject obj;  
  25.        
  26.     options[0].optionString = "-Djava.class.path=.";  
  27.     memset(&vm_args, 0, sizeof(vm_args));  
  28.     vm_args.version = JNI_VERSION_1_4;  
  29.     vm_args.nOptions = 1;  
  30.     vm_args.options = options;  
  31.        
  32.     // 啟動虛擬機  
  33.     status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);  
  34.        
  35.     if (status != JNI_ERR)  
  36.     {  
  37.         // 先獲得class對象  
  38.         cls = (*env)->FindClass(env, "Sample2");  
  39.         if (cls != 0)  
  40.         {  
  41.             // 獲取方法ID, 通過方法名和簽名, 調用靜態方法  
  42.             mid = (*env)->GetStaticMethodID(env, cls, "sayHello""(Ljava/lang/String;)Ljava/lang/String;");  
  43.             if (mid != 0)  
  44.             {  
  45.                 const char* name = "World";  
  46.                 jstring arg = (*env)->NewStringUTF(env, name);  
  47.                 jstring result = (jstring)(*env)->CallStaticObjectMethod(env, cls, mid, arg);  
  48.                 const char* str = (*env)->GetStringUTFChars(env, result, 0);  
  49.                 printf("Result of sayHello: %s\n", str);  
  50.                 (*env)->ReleaseStringUTFChars(env, result, 0);  
  51.             }  
  52.                
  53.             /*** 新建一個對象 ***/ 
  54.             // 調用默認構造函數  
  55.             //obj = (*env)->AllocObjdect(env, cls);   
  56.                
  57.             // 調用指定的構造函數, 構造函數的名字叫做<init>  
  58.             mid = (*env)->GetMethodID(env, cls, "<init>""()V");  
  59.             obj = (*env)->NewObject(env, cls, mid);  
  60.             if (obj == 0)  
  61.             {  
  62.                 printf("Create object failed!\n");  
  63.             }  
  64.             /*** 新建一個對象 ***/ 
  65.                
  66.             // 獲取屬性ID, 通過屬性名和簽名  
  67.             fid = (*env)->GetFieldID(env, cls, "name""Ljava/lang/String;");  
  68.             if (fid != 0)  
  69.             {  
  70.                 const char* name = "icejoywoo";  
  71.                 jstring arg = (*env)->NewStringUTF(env, name);  
  72.                 (*env)->SetObjectField(env, obj, fid, arg); // 修改屬性  
  73.             }  
  74.                
  75.             // 調用成員方法  
  76.             mid = (*env)->GetMethodID(env, cls, "sayHello""()Ljava/lang/String;");  
  77.             if (mid != 0)  
  78.             {  
  79.                 jstring result = (jstring)(*env)->CallObjectMethod(env, obj, mid);  
  80.                 const char* str = (*env)->GetStringUTFChars(env, result, 0);  
  81.                 printf("Result of sayHello: %s\n", str);  
  82.                 (*env)->ReleaseStringUTFChars(env, result, 0);  
  83.             }  
  84.         }  
  85.            
  86.         (*jvm)->DestroyJavaVM(jvm);  
  87.         return 0;  
  88.     }  
  89.     else 
  90.     {  
  91.         printf("JVM Created failed!\n");  
  92.         return -1;  
  93.     }  

這段代碼大概做了這幾件事:

  1. 創建虛擬機JVM, 在程序結束的時候銷毀虛擬機JVM
  2. 尋找class對象
  3. 創建class對象的實例
  4. 調用方法和修改屬性

虛擬的創建

與之相關的有這樣幾個變量

  1. JavaVMOption options[1];  
  2. JNIEnv *env;  
  3. JavaVM *jvm;  
  4. JavaVMInitArgs vm_args; 

JavaVM就是我們需要創建的虛擬機實例

JavaVMOption相當于在命令行里傳入的參數

JNIEnv在Java調用C/C++中每個方法都會有的一個參數, 擁有一個JNI的環境

JavaVMInitArgs就是虛擬機創建的初始化參數, 這個參數里面會包含JavaVMOption

下面就是創建虛擬機

  1. options[0].optionString = "-Djava.class.path=.";  
  2. memset(&vm_args, 0, sizeof(vm_args));  
  3. vm_args.version = JNI_VERSION_1_4;  
  4. vm_args.nOptions = 1;  
  5. vm_args.options = options;  
  6.    
  7. // 啟動虛擬機  
  8. status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); 

 "-Djava.class.path=."看著眼熟吧, 這個就是傳入當前路徑, 作為JVM尋找class的用戶自定義路徑, 我們的Sample2.class就在當前路徑(當然也可以不在當前路徑, 你可以隨便修改).

vm_args.version是Java的版本, 這個應該是為了兼容以前的JDK, 可以使用舊版的JDK, 這個宏定義是在jni.h中,  有以下四種

  1. #define JNI_VERSION_1_1 0x00010001 
  2. #define JNI_VERSION_1_2 0x00010002 
  3. #define JNI_VERSION_1_4 0x00010004 
  4. #define JNI_VERSION_1_6 0x00010006   

vm_args.nOptions的含義是, 你傳入的options有多長, 我們這里就一個, 所以是1。

vm_args.options = options把JavaVMOption傳給JavaVMInitArgs里面去。

然后就是啟動虛擬機了status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args)。

可以通過這個返回值status , 知道虛擬機是否啟動成功

  1. #define JNI_OK           0                 /* success */ 
  2. #define JNI_ERR          (-1)              /* unknown error */ 
  3. #define JNI_EDETACHED    (-2)              /* thread detached from the VM */ 
  4. #define JNI_EVERSION     (-3)              /* JNI version error */ 
  5. #define JNI_ENOMEM       (-4)              /* not enough memory */ 
  6. #define JNI_EEXIST       (-5)              /* VM already created */ 
  7. #define JNI_EINVAL       (-6)              /* invalid arguments */   

尋找class對象, 并實例化

JVM在Java中都是自己啟動的, 在C/C++中只能自己來啟動了, 啟動完之后的事情就和在Java中一樣了, 不過要使用C/C++的語法.

獲取class對象比較簡單, FindClass(env, className).

  1. cls = (*env)->FindClass(env, "Sample2");  

在Java中的類名格式是java.lang.String, 但是className的格式有點不同, 不是使用'.'作為分割, 而是'/', 即java/lang/String.

我們知道Java中構造函數有兩種, 一種是默認的沒有參數的, 一種是自定義的帶有參數的. 對應的在C/C++中, 有兩種調用構造函數的方法.

調用默認構造函數

  1. // 調用默認構造函數  
  2. obj = (*env)->AllocObjdect(env, cls);   

構造函數也是方法, 類似調用方法的方式.

  1. // 調用指定的構造函數, 構造函數的名字叫做<init>  
  2. mid = (*env)->GetMethodID(env, cls, "<init>""()V");  
  3. obj = (*env)->NewObject(env, cls, mid);  

調用方法和修改屬性

關于方法和屬性是有兩個ID與之對應, 這兩個ID用來標識方法和屬性.

  1. jmethodID mid;  
  2. jfieldID fid; 

方法分為靜態和非靜態的, 所以對應的有

  1. mid = (*env)->GetStaticMethodID(env, cls, "sayHello""(Ljava/lang/String;)Ljava/lang/String;");  
  2.    
  3. mid = (*env)->GetMethodID(env, cls, "sayHello""()Ljava/lang/String;");   

上面兩個方法是同名的, 都叫sayHello, 但是簽名不同, 所以可以區分兩個方法.

JNI的函數都是有一定規律的, Static就表示是靜態, 沒有表示非靜態.

方法的調用如下

  1. jstring result = (jstring)(*env)->CallStaticObjectMethod(env, cls, mid, arg);  
  2.    
  3. jstring result = (jstring)(*env)->CallObjectMethod(env, obj, mid);   

我們可以看到靜態方法是只需要class對象, 不需要實例的, 而非靜態方法需要使用我們之前實例化的對象.

屬性也有靜態和非靜態, 示例中只有非靜態的.

獲取屬性ID

  1. fid = (*env)->GetFieldID(env, cls, "name""Ljava/lang/String;");   

改屬性的值

  1. (*env)->SetObjectField(env, obj, fid, arg); // 修改屬性  

關于jstring的說明

java的String都是使用了unicode, 是雙字節的字符, 而C/C++中使用的單字節的字符。

從C轉換為java的字符, 使用NewStringUTF方法

  1. jstring arg = (*env)->NewStringUTF(env, name);  

從java轉換為C的字符, 使用GetStringUTFChars

  1. const char* str = (*env)->GetStringUTFChars(env, result, 0); 
const char* str = (*env)->GetStringUTFChars(env, result, 0);

 編譯和運行

編譯需要頭文件, 頭文件在這兩個目錄中%JAVA_HOME%\include和%JAVA_HOME%\include\win32, ***個是與平臺無關的, 第二個是與平臺有關的, 由于筆者的系統是windows, 所以是win32.

編譯的時候還要一個lib文件, 是對虛擬機的支持, 保證編譯通過.

  1. cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 Sample2.c %JAVA_HOME%\lib\jvm.lib  
我們可以看到在當前目錄下Sample2.exe, 運行的時候需要jvm.dll(不要將其復制到當前目錄下, 這樣不可以運行, 會導致jvm創建失敗)
  1. set PATH=%JAVA_HOME%\jre\bin\client\;%PATH%  
  2. Sample2  
jvm.dll在%JAVA_HOME%\jre\bin\client\目錄下, 所以我把這個目錄加入到PATH中, 然后就可以運行
  1. Result of sayHello: Hello, World!  
  2. Result of sayHello: Hello, icejoywoo! 
關于C++的說明

本示例的C++版本, 請自行下載后面的源代碼來查看, 區別不是很大.

主要是JNIEnv和JavaVM兩個對象, 在C中是結構體, 是函數指針的集合, 在C++中結構體擁有類的能力, 使用起來更為簡便, 與Java之間的差異更小一些.

結語

本文介紹了一個簡單的例子, 分析了其中的一些代碼, 筆者希望通過這篇文章讓大家對JNI的了解更加深入一些.

水平有限, 錯漏在所難免, 歡迎指正!
 

源代碼下載: c調用java.zip

使用方法: 參照里面的build&run.bat, 使用了%JAVA_HOME%環境變量.

注意:

  1. 動態鏈接庫和JDK都有32位和64位的區別, 使用64位系統的朋友, 要注意這個問題, 可能導致運行或編譯錯誤.
  2. 還要注意區分C和C++代碼, 在JNI中兩種代碼有一定的區別, 主要是env和jvm兩個地方.

參考文獻:

  1. public0821, C++調用JAVA方法詳解, http://public0821.iteye.com/blog/423941
  2. Scott Stricker, 用 JNI 進行 Java 編程, http://www.ibm.com/developerworks/cn/education/java/j-jni/section3.html
  3. JDK 6u30 docs, Java Native Interface Specification

原文鏈接:http://www.cnblogs.com/icejoywoo/archive/2012/02/24/2367116.html

【編輯推薦】

  1. 使用JNI進行混合編程:在Java中調用C/C++本地庫
  2. 詳解QML與C++混合編程使用
  3. 程序員新招:Java與C++混合編程
責任編輯:林師授 來源: 會被淹死的魚博客
相關推薦

2012-03-20 11:37:24

JavaJNI

2009-07-20 09:53:43

Java混合編程

2011-07-01 14:55:28

Qt QML C++

2012-04-16 13:22:56

CORBAJavaC++

2011-02-15 13:12:02

JavaC++

2010-01-20 14:35:55

C++調用

2010-01-18 17:14:50

C++語言

2010-01-12 15:13:37

Visual C++環

2014-09-25 11:08:17

ECLLispC語言

2010-01-18 13:42:51

C++代碼

2010-03-10 19:18:10

Python scri

2011-08-22 17:13:00

LuaC++函數

2011-05-18 17:56:38

C#C++

2011-05-18 18:05:47

C#C++

2010-01-20 10:49:29

Visual C++界

2010-01-11 09:28:34

C++編程

2021-07-26 05:26:54

Androidc++java

2009-06-19 16:55:47

JNI調用C語言

2019-08-28 14:21:39

C++C接口代碼

2020-07-31 18:33:56

C++編程語言
點贊
收藏

51CTO技術棧公眾號

一区二区三区四区视频在线| 国产精品福利久久久| 亚洲自拍偷拍在线| 亚洲综合自拍网| 小早川怜子影音先锋在线观看| 99热99精品| 国产精品国语对白| 日本青青草视频| 要久久电视剧全集免费| 欧美日韩精品一区视频| 污污污污污污www网站免费| 神马午夜精品95| 另类中文字幕网| 欧美激情亚洲一区| 免费看污片的网站| 中文无码日韩欧| 国产精品午夜电影| 亚洲自拍偷拍一区| 日韩在线 中文字幕| 亚洲精品国产偷自在线观看| 精品网站999www| 手机精品视频在线| 3d性欧美动漫精品xxxx软件| 亚洲欧美日韩电影| 国产精品入口日韩视频大尺度| 一级片一级片一级片| 美女久久久久久| 午夜日韩在线电影| 亚洲在线欧美| 日本天堂影院在线视频| 亚洲精品三级| 久久精品人人爽| 蜜桃av免费看| 国产成人福利av| 欧美日韩aaaaaa| 自慰无码一区二区三区| 欧美黑人猛交的在线视频| 久久久国产精品不卡| 懂色中文一区二区三区在线视频| 中文字幕黄色av| 成人一二三区| 欧美日韩成人在线| 久久久一本二本三本| 性欧美高清come| 国产精品久久久久婷婷二区次| 久久精品99| 午夜免费福利视频| 国产精品1024久久| 国产欧美日韩精品专区| 久操视频在线免费观看| 国产美女一区| 久久久久久有精品国产| 欧美成人一区二区三区高清| 外国成人激情视频| 久久视频在线直播| 美女伦理水蜜桃4| 日韩在线网址| 日韩欧美在线一区二区三区| 亚洲自拍第三页| 欧美成人黄色| 欧美精品久久一区| 97免费视频观看| 国产一二三区在线观看| 成人午夜碰碰视频| 91久久爱成人| 中文字幕精品无码一区二区| 一本一本久久| 正在播放欧美视频| 国产综合精品在线| 成人影视亚洲图片在线| 日韩中文字幕免费看| 91免费在线看片| 欧美3p在线观看| 久久精品一偷一偷国产| 免费在线观看h片| 日韩精品亚洲aⅴ在线影院| 欧美日韩中文字幕精品| 五月婷婷深爱五月| 免费一级欧美在线观看视频| 884aa四虎影成人精品一区| 婷婷激情综合五月天| 日韩精品亚洲专区在线观看| 精品久久人人做人人爰| 无码精品一区二区三区在线播放| 欧美综合精品| 国产亚洲美女久久| 91精品又粗又猛又爽| 另类尿喷潮videofree| 日韩黄色av网站| 精品欧美一区二区久久久| 日韩综合在线| 欧美精品免费播放| 国产小视频在线免费观看| 视频一区二区欧美| 亚洲精品免费在线视频| 亚洲av无码乱码国产精品| 99久久免费视频.com| 日韩理论片在线观看| 成人av福利| 午夜精品在线看| 日本xxxx黄色| 999久久久精品一区二区| 亚洲欧美一区二区三区久久 | 久久人妻无码aⅴ毛片a片app| 欧美久久99| 国产成人精品一区二区在线| 精品国产av 无码一区二区三区| 91丨porny丨首页| 自拍偷拍亚洲色图欧美| 日韩大片免费观看| 日韩一区二区不卡| 欧美成人国产精品一区二区| 午夜日韩视频| 国产精品18久久久久久麻辣| 亚洲精品一区二区三区区别| 国产精品全国免费观看高清 | 野花视频免费在线观看| 九九热爱视频精品视频| 欧美国产日产韩国视频| 中文在线观看av| 99精品在线观看视频| 欧美日韩一区二区三区电影| 成人免费网站www网站高清| 精品日本一线二线三线不卡| 成人黄色短视频| 另类亚洲自拍| 国产精品日韩一区二区三区| 精品久久av| 婷婷丁香久久五月婷婷| 国产黑丝在线视频| 国产精品88久久久久久| 日韩免费在线视频| 丝袜视频国产在线播放| 亚洲成人激情av| 四川一级毛毛片| 欧美岛国激情| 国产精品久久久久久久久男| 可以免费看污视频的网站在线| 午夜精品一区在线观看| 人妻精油按摩bd高清中文字幕| 日本一本不卡| 国产大片精品免费永久看nba| 偷拍自拍在线| 亚洲免费观看高清完整版在线观看熊 | 国产精品久久久久久久av大片| 亚洲欧美色视频| 亚洲第一久久影院| 精品人妻一区二区免费| 欧美成人国产| 91丨九色丨国产在线| 免费在线视频欧美| 欧美精品欧美精品系列| 日韩三级在线观看视频| 狠狠色丁香婷婷综合| 男女激烈动态图| 国产一区二区三区免费观看在线 | 国产特黄级aaaaa片免| 99亚洲伊人久久精品影院红桃| 国产亚洲二区| 热三久草你在线| 亚洲精品一区二区在线| 免费视频网站在线观看入口| 国产日本欧洲亚洲| 中文字幕免费高清在线| 伊人青青综合网| 99re在线播放| 国产美女精品写真福利视频| 日韩久久免费电影| 波多野结衣一区二区三区在线 | 亚洲女人毛茸茸高潮| 日本女优在线视频一区二区| 国产精品美女免费看| 国家队第一季免费高清在线观看| 色94色欧美sute亚洲线路一久 | 国产精品传媒视频| 国产欧美精品一二三| 欧美片第1页综合| 国产欧美一区二区视频| 日韩影片中文字幕| 播播国产欧美激情| 亚洲精品.www| 欧美性生交大片免费| 超薄肉色丝袜一二三| 国内久久婷婷综合| 免费看又黄又无码的网站| 国产剧情在线观看一区| 91亚洲国产精品| 91九色在线播放| 国产一区二区精品丝袜| 国产精品视频一二区| 亚洲r级在线视频| 免费看裸体网站| 国产成人免费av在线| 青青青国产在线视频| 一区二区三区国产好| 欧美一区二区.| 免费黄网站在线| 欧美精品一区二区精品网| 欧美一区二区三区久久久| 国产精品国产馆在线真实露脸| 国产精品亚洲一区二区无码| 日韩精品亚洲一区二区三区免费| 粉嫩av一区二区三区免费观看| 亚洲美女尤物影院| 久久国产加勒比精品无码| 日本中文字幕一区二区有码在线 | av一级黄色片| 色网站国产精品| 久久久精品99| 中文字幕欧美国产| 完美搭档在线观看| 韩国一区二区在线观看| 男女视频一区二区三区| 黄色日韩精品| 国产91av视频在线观看| 天海翼精品一区二区三区| 亚洲综合小说区| 草莓视频成人appios| 国外成人在线视频| 在线观看男女av免费网址| 在线a欧美视频| 天天干天天爽天天操| 欧美一区二区三区日韩| 中文字幕一区二区在线视频 | 99蜜月精品久久91| 91国产视频在线| 少女频道在线观看高清| 日韩中文字幕免费| 成人福利在线| 亚洲欧洲国产一区| 天堂在线中文| 精品欧美久久久| 国产视频在线一区| 欧美日韩国产系列| 中文天堂在线视频| 欧洲色大大久久| 久久久久久在线观看| 精品国产1区2区| 国产午夜福利一区二区| www.欧美日韩| 自拍视频第一页| 国产伦精品一区二区三区在线观看| 男女视频在线看| 日韩高清一区二区| 国产免费视频传媒| 日韩高清欧美激情| 午夜免费福利在线| 老司机午夜精品| 午夜免费高清视频| 免费人成在线不卡| 欧美日韩在线观看不卡| 蜜臀av性久久久久蜜臀av麻豆| 91热这里只有精品| 日本视频在线一区| 天天干天天操天天做| 精品一区二区三区久久| 伊人网在线综合| 国产一区二区电影| 久色视频在线播放| 国产精品嫩草99av在线| 久久久久久久久久久免费视频| 久久xxxx| 国产一级特黄a大片免费| 青青草一区二区三区| 在线观看免费av网址| 国产伦精品一区二区三区免费| 性高潮久久久久久| 97se亚洲国产综合自在线不卡| 国产国语性生话播放| 国产网站一区二区| 91香蕉视频污在线观看| 亚洲精品免费电影| 日韩成人高清视频| 色88888久久久久久影院按摩| 亚洲高清视频免费观看| 欧美群妇大交群中文字幕| 亚洲高清视频网站| 日韩精品日韩在线观看| 香蕉视频在线播放| 欧美刺激性大交免费视频| 捆绑调教日本一区二区三区| 国产成人精品最新| 国产精品3区| 韩国精品一区二区三区六区色诱| 在线成人动漫av| 99精品视频网站| 日韩午夜激情| jizz大全欧美jizzcom| 国产成人av电影在线| 亚洲av无码一区二区三区人| 亚洲三级在线免费观看| 国产无人区码熟妇毛片多| 欧美视频在线观看一区二区| 精品人妻一区二区三区浪潮在线| 精品亚洲一区二区三区在线观看 | swag国产精品一区二区| 欧美精品国产精品久久久| 希岛爱理一区二区三区| 18禁免费无码无遮挡不卡网站| 精品亚洲porn| 亚洲精品乱码久久久久久久| 中文字幕永久在线不卡| 青青草av在线播放| 欧美精品在线视频| 免费毛片在线| 欧美激情视频一区二区| 国产一区二区色噜噜| 精品国产一区二区三区四区vr| 999国产精品永久免费视频app| 黄色av网址在线播放| 国产一区二区电影| 毛片视频免费播放| 欧美视频在线视频| 韩国av永久免费| 日韩一区二区在线视频| 欧美三级网址| 114国产精品久久免费观看| 俺要去色综合狠狠| 日韩在线综合网| 国产激情偷乱视频一区二区三区| 亚洲精品色午夜无码专区日韩| 欧美日韩国产一区二区三区| 精品人妻午夜一区二区三区四区 | 久久久久久国产精品无码| 亚洲综合色噜噜狠狠| 国产又黄又粗又猛又爽| 亚洲视频自拍偷拍| gay欧美网站| 精品免费二区三区三区高中清不卡| 中文视频一区| 亚洲第一天堂久久| 国产精品不卡一区| 自拍偷拍第八页| 亚洲视频在线观看| 成人性生交大片免费网站| 精品日本一区二区三区在线观看| 国产精品hd| avtt中文字幕| 亚洲一区二区三区影院| 国产色视频在线| 久久av在线播放| 婷婷久久综合九色综合99蜜桃| 亚洲国产精品一区二区第四页av| 日韩电影一区二区三区四区| 18禁裸乳无遮挡啪啪无码免费| 岛国av一区二区在线在线观看| 亚洲 美腿 欧美 偷拍| 91精品国产成人| 婷婷综合电影| 116极品美女午夜一级| 2020国产精品| 欧美成人精品欧美一级乱黄| 亚洲国产黄色片| 天天综合av| 日本一区二区三区免费看| 久久久久国产精品一区二区| 国产又粗又猛又爽视频| 欧美亚州韩日在线看免费版国语版| 粉嫩av一区| 国产日韩中文在线| 亚洲五月综合| 中文字幕一二三区| 午夜久久久久久久久| 青青草免费在线视频| 国产精品久久久久久久久久99| 欧美肥老太太性生活| 欧美国产日韩在线视频| 亚洲综合激情小说| 同心难改在线观看| 国产精品久久久久久久app| 亚洲电影影音先锋| 久草免费资源站| 日韩欧美999| 欧美a免费在线| http;//www.99re视频| 中文久久精品| 久久久久亚洲AV成人无在| 欧美一区二区三区日韩| 擼擼色在线看观看免费| 亚洲蜜桃在线| 国产成人av影院| 香蕉影院在线观看| 久青草国产97香蕉在线视频| 国产精品久久久久av蜜臀 | 久久黄色级2电影| 久久国产精品波多野结衣| 亚洲跨种族黑人xxx| 国产一区影院| 日韩亚洲欧美视频| 国产精品一色哟哟哟| 亚洲欧美在线视频免费| 在线日韩av观看| 超碰97久久| 美女一区二区三区视频| 一区二区三区欧美| 黄色片在线看| 成人欧美一区二区三区视频| 日韩综合一区二区| 久久久久无码国产精品不卡| 亚洲香蕉成视频在线观看|