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

使用JNI進(jìn)行混合編程:在Java中調(diào)用C/C++本地庫

開發(fā) 后端
JNI是Java Native Interface的英文縮寫, 中文翻譯為本地調(diào)用, 自從Java 1.1開始就成為了Java標(biāo)準(zhǔn)的一部分。

JNI是Java Native Interface的英文縮寫, 中文翻譯為本地調(diào)用, 自從Java 1.1開始就成為了Java標(biāo)準(zhǔn)的一部分。

C/C++是系統(tǒng)級的編程語言, 可以用來開發(fā)任何和系統(tǒng)相關(guān)的程序和類庫, 但是Java本身編寫底層的應(yīng)用比較難實(shí)現(xiàn), 使用JNI可以調(diào)用現(xiàn)有的本地庫, 極大地靈活了Java的開發(fā)。

C/C++的效率是目前***的語言, 可以使用C/C++來實(shí)現(xiàn)一些實(shí)時性非常高的部分. C/C++和Java本身都是非常流行的編程語言, 一些大型軟件中經(jīng)常使用語言之間的混合編程。

鑒于目前網(wǎng)絡(luò)上JNI的文章不是特別多, 我將自己的一些總結(jié)寫在這里. 如有錯漏, 歡迎指正!

Java調(diào)用C/C++大概有這樣幾個步驟

  • 編寫帶有native方法的Java類, 使用javac工具編譯Java類
  • 使用javah來生成與native方法對應(yīng)的頭文件
  • 實(shí)現(xiàn)相應(yīng)的頭文件, 并編譯為動態(tài)鏈接庫(windows下是.dll, linux下是.so)

下面就完整的介紹一個簡單的Java調(diào)用C/C++的例子, 這個例子是來自http://www.ibm.com/developerworks/cn/education/java/j-jni/index.html, 不過其中有一些錯誤, 這個文章是非常不錯的JNI學(xué)習(xí)資料, 但是非常古老.

編寫Java類

我們來編寫一個Sample1的java類

  1. public class Sample1 {  
  2.     public native int intMethod(int n);  
  3.     public native boolean booleanMethod(boolean bool);  
  4.     public native String stringMethod(String text);  
  5.     public native int intArrayMethod(int[] intArray);  
  6.        
  7.     public static void main(String[] args) {  
  8.         System.loadLibrary("Sample1");  
  9.         Sample1 sample = new Sample1();  
  10.         int square = sample.intMethod(5);  
  11.         boolean bool = sample.booleanMethod(true);  
  12.         String text = sample.stringMethod("Java");  
  13.         int sum = sample.intArrayMethod(new int[]{1,2,3,4,5,8,13});  
  14.            
  15.         System.out.println("intMethod: " + square);  
  16.         System.out.println("booleanMethod: " + bool);  
  17.         System.out.println("stringMethod: " + text);  
  18.         System.out.println("intArrayMethod: " + sum);  
  19.     }  

上面有4個native方法, 分別是4種類型的參數(shù), int, boolean, String, int[].

其中有一句比較重要, 這句話加載了動態(tài)類庫

  1. System.loadLibrary("Sample1"); 

在windows下加載的就是Sample1.dll, 在linux下加載的就是Sample1.so。

本文使用的windowws, 所以后面使用Sample1.dll來表示Sample1動態(tài)鏈接庫。

注意:不可以在代碼中寫上后綴dll或so. 還要保證Sample1.dll在path路徑中. 這個Sample1.dll是我們后面需要編譯出來的東西。

4個native方法就是我們需要用C來實(shí)現(xiàn)的方法。

編譯Sample1.java, 使用命令行(windows是cmd, linux下一般是bash)

>javac Sample1.java

可以看到Sample1.class文件

使用javah生成頭文件

在命令行中運(yùn)行

>javah Sample1

可以在目錄下看到一個新文件Sample1.h

  1. /* DO NOT EDIT THIS FILE - it is machine generated */ 
  2. #include <jni.h>  
  3. /* Header for class Sample1 */ 
  4.    
  5. #ifndef _Included_Sample1  
  6. #define _Included_Sample1  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /*  
  11.  * Class:     Sample1  
  12.  * Method:    intMethod  
  13.  * Signature: (I)I  
  14.  */ 
  15. JNIEXPORT jint JNICALL Java_Sample1_intMethod  
  16.   (JNIEnv *, jobject, jint);  
  17.    
  18. /*  
  19.  * Class:     Sample1  
  20.  * Method:    booleanMethod  
  21.  * Signature: (Z)Z  
  22.  */ 
  23. JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod  
  24.   (JNIEnv *, jobject, jboolean);  
  25.    
  26. /*  
  27.  * Class:     Sample1  
  28.  * Method:    stringMethod  
  29.  * Signature: (Ljava/lang/String;)Ljava/lang/String;  
  30.  */ 
  31. JNIEXPORT jstring JNICALL Java_Sample1_stringMethod  
  32.   (JNIEnv *, jobject, jstring);  
  33.    
  34. /*  
  35.  * Class:     Sample1  
  36.  * Method:    intArrayMethod  
  37.  * Signature: ([I)I  
  38.  */ 
  39. JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod  
  40.   (JNIEnv *, jobject, jintArray);  
  41.    
  42. #ifdef __cplusplus  
  43. }  
  44. #endif  
  45. #endif 

我們可以看到其中有四個函數(shù)聲明, Java_完整類名_方法名, 完整類名包括了包名, 例如demo.Sample1是完整類名, 對應(yīng)的這里就是demo_Sample1.

在注釋中我們可以看到這樣一個東西 Signature, 這個是方法的簽名. 關(guān)于Signature, 下面通過一個表格來說明。

java類型 Signature 備注
boolean Z  
byte B  
char C  
short S  
int I  
long L  
float F  
double D  
void V  
object L用/分割的完整類名 例如: Ljava/lang/String表示String類型
Array [簽名 例如: [I表示int數(shù)組, [Ljava/lang/String表示String數(shù)組
Method (參數(shù)簽名)返回類型簽名 例如: ([I)I表示參數(shù)類型為int數(shù)組, 返回int類型的方法

上面頭文件的***個函數(shù)聲明

  1. JNIEXPORT jint JNICALL Java_Sample1_intMethod (JNIEnv *, jobject, jint); 

注釋中的簽名是 Signature: (I)I

在每個函數(shù)的參數(shù)列表中都有JNIEnv *和 jobject兩個參數(shù), 這兩個參數(shù)稍候說明。

實(shí)現(xiàn)頭文件中的函數(shù)

可以使用C語言來實(shí)現(xiàn), 也可以使用C++來實(shí)現(xiàn), 下面先說說C語言的實(shí)現(xiàn)。

  1. #include "Sample1.h" 
  2. #include <string.h>  
  3.    
  4. JNIEXPORT jint JNICALL Java_Sample1_intMethod  
  5.   (JNIEnv *env, jobject obj, jint num)  
  6. {  
  7.     return num * num;  
  8. }  
  9.    
  10. JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod  
  11.   (JNIEnv *env, jobject obj, jboolean boolean)  
  12. {  
  13.     return !boolean;  
  14. }  
  15.    
  16. JNIEXPORT jstring JNICALL Java_Sample1_stringMethod  
  17.   (JNIEnv *env, jobject obj, jstring string)  
  18. {  
  19.     const char* str = (*env)->GetStringUTFChars(env, string, 0);  
  20.     char cap[128];  
  21.     strcpy(cap, str);  
  22.     (*env)->ReleaseStringUTFChars(env, string, 0);  
  23.     return (*env)->NewStringUTF(env, strupr(cap));  
  24. }  
  25.    
  26. JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod  
  27.   (JNIEnv *env, jobject obj, jintArray array)  
  28. {  
  29.     int i, sum = 0;  
  30.     jsize len = (*env)->GetArrayLength(env, array);  
  31.     jint *body = (*env)->GetIntArrayElements(env, array, 0);  
  32.        
  33.     for (i = 0; i < len; ++i)  
  34.     {  
  35.         sum += body[i];  
  36.     }  
  37.     (*env)->ReleaseIntArrayElements(env, array, body, 0);  
  38.     return sum;  

(*env)->GetStringUTFChars()這個方法, 是用來在Java和C之間轉(zhuǎn)換字符串的, 因?yàn)镴ava本身都使用了雙字節(jié)的字符, 而C語言本身都是單字節(jié)的字符, 所以需要進(jìn)行轉(zhuǎn)換.

JNIEnv *是每個函數(shù)都有的參數(shù), 它包含了很多有用的方法, 使用起來類似Java的反射, 也提供了這樣一個編碼轉(zhuǎn)換的函數(shù).

GetStringUTFChars()和NewStringUTF(), ***個是從UTF8轉(zhuǎn)換為C的編碼格式, 第二個是根據(jù)C的字符串返回一個UTF8字符串.

ReleaseStringUTFChars()是用來釋放對象的, 在Java中有虛擬機(jī)進(jìn)行垃圾回收, 但是在C語言中, 這些對象必須手動回收. 否則可能造成內(nèi)存泄漏.

函數(shù)的名字一眼看到就可以猜出功能, jni.h中的大部分函數(shù)名都是這樣.

如果是C++的話, 這段代碼該怎么寫?

下面是C++的代碼

  1. #include "Sample1.h"  
  2. #include <string.h>  
  3.    
  4. JNIEXPORT jint JNICALL Java_Sample1_intMethod  
  5.   (JNIEnv *env, jobject obj, jint num)  
  6. {  
  7.     return num * num;  
  8. }  
  9.    
  10. JNIEXPORT jboolean JNICALL Java_Sample1_booleanMethod  
  11.   (JNIEnv *env, jobject obj, jboolean boolean)  
  12. {  
  13.     return !boolean;  
  14. }  
  15.    
  16. JNIEXPORT jstring JNICALL Java_Sample1_stringMethod  
  17.   (JNIEnv *env, jobject obj, jstring string)  
  18. {  
  19.     const char* str = env->GetStringUTFChars(string, 0);  
  20.     char cap[128];  
  21.     strcpy(cap, str);  
  22.     env->ReleaseStringUTFChars(string, 0);  
  23.     return env->NewStringUTF(strupr(cap));  
  24. }  
  25.    
  26. JNIEXPORT jint JNICALL Java_Sample1_intArrayMethod  
  27.   (JNIEnv *env, jobject obj, jintArray array)  
  28. {  
  29.     int i, sum = 0;  
  30.     jsize len = env->GetArrayLength(array);  
  31.     jint *body = env->GetIntArrayElements(array, 0);  
  32.        
  33.     for (i = 0; i < len; ++i)  
  34.     {  
  35.         sum += body[i];  
  36.     }  
  37.     env->ReleaseIntArrayElements(array, body, 0);  
  38.     return sum;  

上述兩端代碼非常相似, 只有一個不同點(diǎn)

C代碼: (*env)->GetStringUTFChars(env, string, 0);

C++代碼: env->GetStringUTFChars(string, 0);

C語言中使用的是結(jié)構(gòu)體的函數(shù)指針, 而在C++中使用的還是struct, 我們知道struct在C++中和class的功能是幾乎一樣的, struct也可以用來定義類, 所以env在C++中是個類對象的指針.

編譯和運(yùn)行

這里使用的是微軟編譯器, 編譯C語言版的dll

>cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD Sample1.c -FeSample1.dll

編譯C++版本的dll

>cl -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD Sample1.cpp -FeSample1.dll

運(yùn)行

>java Sample1

注意: 64位版本的JDK可能會在運(yùn)行時報(bào)錯:

java.lang.UnsatisfiedLinkError: ...Sample1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

如果您有這樣的錯誤, 請使用32位的JDK來重新運(yùn)行.

運(yùn)行結(jié)果如下:

intMethod: 25 
booleanMethod: false 
stringMethod: JAVA 
intArrayMethod: 36

源代碼下載: Sample1.zip

運(yùn)行其中的build&run.bat文件即可, 如有錯誤請根據(jù)實(shí)際情況修改其中的一些參數(shù).

DLL工程文件VC6.0和VS2010的: VC6.0&VS2010.zip

參考文獻(xiàn):

  1. Scott Stricker, 用 JNI 進(jìn)行 Java 編程, http://www.ibm.com/developerworks/cn/education/java/j-jni/section2.html
  2. JDK 6u30 docs, Java Native Interface Specification, Chapter 3 JNI Types and Data Structures, Type Signatures.

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

【編輯推薦】

  1. Java通過SSH2協(xié)議運(yùn)行遠(yuǎn)程程序
  2. Java Socket編程:初識TCP Socket
  3. Java Socket編程:如何識別網(wǎng)絡(luò)主機(jī)
  4. Java Socket編程:基本的術(shù)語和概念
  5. Java集合類ArrayList循環(huán)中刪除特定元素

 

責(zé)任編輯:林師授 來源: icejoywoo的博客
相關(guān)推薦

2012-04-28 15:28:21

JNI混合編程Java

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++調(diào)用

2010-01-18 17:14:50

C++語言

2010-01-12 15:13:37

Visual C++環(huán)

2009-06-15 14:48:13

Visual C++本狀態(tài)管理

2011-08-22 17:13:00

LuaC++函數(shù)

2011-05-18 17:15:45

2023-03-15 15:58:11

Python動態(tài)庫C++

2010-01-11 09:28:34

C++編程

2010-01-20 10:49:29

Visual C++界

2010-01-26 13:55:07

C++標(biāo)準(zhǔn)模板庫

2024-01-26 16:32:08

2020-07-31 18:33:56

C++編程語言

2019-08-28 14:21:39

C++C接口代碼

2021-07-26 05:26:54

Androidc++java

2009-06-19 16:55:47

JNI調(diào)用C語言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

日日摸夜夜添夜夜添精品视频| 成人在线精品| 国产欧美日韩中文久久| 国产精品激情av电影在线观看| 精品欧美一区二区久久久| 成人四虎影院| 亚洲国产欧美日韩另类综合 | 一区二区冒白浆视频| 国产又粗又猛又黄| 国产精品久久久久9999高清| 在线精品国产成人综合| youjizz.com日本| 99riav视频一区二区| 一区二区三区欧美| 日韩精彩视频| 亚洲av无码乱码国产麻豆| 中文字幕在线观看免费视频| 欧美jizzhd69巨大| 成人sese在线| 成人国产精品一区二区| 丰满少妇乱子伦精品看片| 欧美va久久久噜噜噜久久| 精品国产免费人成电影在线观看四季| 免费看a级黄色片| 波多野结衣在线高清| 国产精品亲子乱子伦xxxx裸| 久久久久资源| 亚洲第一大网站| 麻豆国产91在线播放| 69久久夜色精品国产7777| 青草影院在线观看| 日韩中文字幕高清在线观看| 精品丝袜一区二区三区| 波多野结衣办公室双飞 | 国产欧美在线观看| 国产精品美女久久久久av爽| 你懂的国产精品永久在线| 国产亚洲精品久久久优势| 国产美女视频免费观看下载软件| 99视频这里有精品| 欧美日韩亚洲综合一区二区三区| 成人在线免费在线观看| 国产羞羞视频在线播放| 曰韩精品一区二区| 久久久一二三四| 亚洲xxxxxx| 国产欧美一区二区三区鸳鸯浴| 久久久久网址| 无码国产精品一区二区色情男同| 国产原创一区二区| 国产欧美一区二区三区视频| 中文字幕在线观看第二页| 三级欧美在线一区| 国产成人精品a视频一区www| 日本熟女毛茸茸| 欧美专区在线| 国产精品v片在线观看不卡| 欧产日产国产69| 久久成人一区| 国产精品高潮在线| 日韩精选在线观看| 老司机精品视频在线| 国产乱人伦真实精品视频| 伊人网av在线| 黑人精品欧美一区二区蜜桃| 91免费福利视频| 国产激情无套内精对白视频| 粉嫩嫩av羞羞动漫久久久| 成人在线看片| 在线观看xxx| 久久久国产精品不卡| 日韩三级电影免费观看| 亚洲s色大片| 亚洲精品视频一区| 美女黄色免费看| 亚洲人体影院| 欧美亚洲国产bt| 久久人人爽av| 一区二区三区四区精品视频| 日韩高清中文字幕| а天堂中文在线资源| 综合久久亚洲| 久久久久在线观看| 黄色片视频免费| 国模一区二区三区白浆| 91久色国产| 四虎影视精品成人| 国产精品久久久久aaaa樱花| 精品国产一区二区三区在线| 999精品网| 欧美亚洲图片小说| 亚洲成人av免费观看| 亚洲精品国模| 成年人精品视频| 中文字幕第15页| 久久精品国产亚洲a| 国产伦精品一区二区三区四区视频 | 婷婷在线播放| 色999日韩国产欧美一区二区| 777一区二区| 动漫视频在线一区| 一区二区欧美激情| 妺妺窝人体色www婷婷| 久久亚洲电影| av成人免费观看| 久久精品国产亚洲a∨麻豆| 亚洲素人一区二区| 欧美日韩亚洲一| 欧州一区二区三区| 亚洲精品中文字幕有码专区| 色欲人妻综合网| 久热国产精品| 亚洲xxxxx电影| 国产污视频在线| 亚洲午夜电影在线观看| 亚洲色图 在线视频| 久久国产精品免费精品3p| 日韩视频―中文字幕| 久久黄色精品视频| 丁香婷婷深情五月亚洲| 亚洲精品影院| 亚洲伊人av| 精品国产髙清在线看国产毛片| 91动漫免费网站| 日韩高清不卡一区二区| 久久精品aaaaaa毛片| 亚洲性图自拍| 69久久夜色精品国产69蝌蚪网| 日韩乱码人妻无码中文字幕久久| 亚洲色图网站| 成人a视频在线观看| 国产精品四虎| 色老综合老女人久久久| 波多野结衣先锋影音| 亚洲午夜电影| 国产精品v欧美精品v日韩| 欧美日韩视频在线播放| 欧美中文字幕不卡| 国精产品一区二区三区| 国产精品日韩久久久| 九九九九九精品| 2018av在线| 亚洲第一福利网| 精品肉丝脚一区二区三区| 国产精品一品二品| 男女激烈动态图| 精品一区二区三区视频在线播放 | 国产欧美日韩伦理| 欧美伦理免费在线| 欧美成人a视频| 九九九免费视频| 丁香婷婷深情五月亚洲| 国产精品www在线观看| 91蝌蚪精品视频| 久久久免费精品| 姝姝窝人体www聚色窝| 午夜久久久久久久久久一区二区| 美女日批在线观看| 亚洲精品偷拍| 欧美婷婷久久| 97成人超碰| www.欧美免费| 北条麻妃一二三区| 性做久久久久久久久| 国产精品无码一区二区三区免费| 噜噜爱69成人精品| 一区二区三区的久久的视频| 国产欧美视频在线| 高清欧美电影在线| 日韩有码电影| 欧美日韩精品欧美日韩精品| 希岛爱理中文字幕| 成人动漫一区二区| 欧在线一二三四区| 色小子综合网| 国产精品国产亚洲精品看不卡15| 狼人综合视频| 在线免费观看羞羞视频一区二区| 99国产在线播放| 天天综合天天综合色| 亚洲精品午夜视频| 久草热在线观看| 悠悠资源网久久精品| 精品福利影视| 国产精品无码久久久久| 色综合久久88| 黄色大片在线免费观看| 91麻豆精品国产91久久久久久久久 | 欧美男人操女人视频| 国产成人午夜视频网址| 91亚洲天堂| 亚洲精品一区二区网址| 国产麻豆免费观看| 欧美天堂在线观看| 玖玖爱这里只有精品| 久久毛片高清国产| 在线成人免费av| 日韩精彩视频在线观看| www.av91| 禁果av一区二区三区| 99久热re在线精品996热视频 | 国产精品一二三视频| 黄色在线看片| 日韩中文字幕亚洲| 麻豆导航在线观看| 精品久久人人做人人爱| 精品国产青草久久久久96| 午夜久久久久久电影| 亚洲最大的黄色网址| 91免费看`日韩一区二区| 日本网站在线看| 日产国产欧美视频一区精品| 欧美一级免费播放| 国产韩日影视精品| 日韩视频专区| 欧美一区 二区| www.成人三级视频| vam成人资源在线观看| 久久电影一区| 日本久久久久久久| 爱情岛亚洲播放路线| 久久亚洲综合国产精品99麻豆精品福利 | 日本一不卡视频| 国产免费观看高清视频| 欧美日本一区二区高清播放视频| 亚洲欧美日韩精品综合在线观看| 亚洲区小说区图片区qvod按摩 | 亚洲日本黄色片| 日韩精品1区2区3区| 国产精品动漫网站| 日韩午夜免费视频| 国产91沈先生在线播放| 一本一道久久a久久精品蜜桃| 污视频在线免费观看一区二区三区| 欧美色图婷婷| 九九九九精品九九九九| 国产精品极品国产中出| 高清一区二区三区视频| 亚洲精品不卡在线观看| 亚洲综合大片69999| 成人污污www网站免费丝瓜| 成人国产精品一区| 久久久久久久久久久久电影| 成人午夜激情网| 国产一区二区三区亚洲综合| 成人a级免费视频| 麻豆精品在线| 99九九电视剧免费观看| 91国内精品白嫩初高生| 国产精品swag| 亚洲免费成人av在线| 欧美福利精品| 欧美一区二区性| 亚洲一区二区在| 一级毛片免费高清中文字幕久久网| 黄色a级在线观看| 欧美涩涩视频| 婷婷五月综合缴情在线视频| 一区二区三区四区五区精品视频| 国产97在线 | 亚洲| 久久久综合网| 视频二区在线播放| 国产一区二区0| www.com日本| 91香蕉视频污| 性少妇xx生活| 亚洲精品国产a久久久久久| 久久97人妻无码一区二区三区| 亚洲v精品v日韩v欧美v专区 | 欧美精品色一区二区三区| 99久久99久久久精品棕色圆| 精品国产区一区| 人成免费电影一二三区在线观看| 国产一区二区三区欧美| 欧美精品日韩在线| 国产精品久久久久久久久久久久久久久 | 在线观看天堂av| 亚洲精品成人天堂一二三| 日本熟妇毛茸茸丰满| 在线免费观看日本一区| 国产精品探花视频| 亚洲国产精久久久久久 | 欧美精品一区二区免费| 51漫画成人app入口| 国产精品美女午夜av| 欧美经典影片视频网站| 久久综合中文色婷婷| 久久综合av| 9久久9毛片又大又硬又粗| 奇米在线7777在线精品| 国产免费a级片| 欧美经典一区二区| 国产性生活网站| 欧美日韩一区二区三区不卡| 亚洲国产av一区二区| 夜夜嗨av一区二区三区免费区 | av在线不卡观看| a网站在线观看| 亚洲国产精彩中文乱码av| 思思99re6国产在线播放| 91av在线国产| 国产一区二区三区精品在线观看| 欧美久久在线| 在线欧美亚洲| 激情图片中文字幕| 国产女主播在线一区二区| 国产精品theporn动漫| 欧美精品视频www在线观看| 日韩porn| 性欧美激情精品| 日韩中文字幕在线一区| 亚洲7777| 日日夜夜免费精品视频| 欲求不满的岳中文字幕| 亚洲精品视频免费看| 亚洲综合精品视频| 亚洲一级一级97网| 川上优av中文字幕一区二区| 99精品在线直播| 中国精品18videos性欧美| 在线观看国产中文字幕| 久久这里只有精品首页| 久久久久黄色片| 日韩一区二区三区视频| 美女国产在线| 国产拍精品一二三| 欧美日韩高清| 丁香啪啪综合成人亚洲| 99国产精品久久| 日韩精品一区二区三| 日韩欧美国产三级| av网站导航在线观看免费| 国产日韩av在线播放| 日韩欧美网站| 邪恶网站在线观看| 日本一区二区三区久久久久久久久不 | 136国产福利精品导航网址| 亚洲AV无码久久精品国产一区| 最近中文字幕一区二区三区| 91精品国自产| 久久精品99国产精品酒店日本| 久久er热在这里只有精品66| 亚洲午夜精品福利| 久久99久久99小草精品免视看| 日本一二三不卡视频| 欧美日韩美少妇| 老司机午夜在线| 亚洲www视频| 欧美日韩99| 午夜剧场免费看| 午夜精品久久久久久久久久久 | 久久久另类综合| 日韩人妻精品中文字幕| 亚洲性猛交xxxxwww| yw.尤物在线精品视频| 伊人狠狠色丁香综合尤物| 极品少妇一区二区| 欧美精品一区二区蜜桃| 精品国产人成亚洲区| 成人欧美magnet| 亚欧精品在线| 国产成人精品一区二区三区四区| 久久久久久久国产视频| 日韩国产欧美区| 欧美日韩女优| 91看片淫黄大片91| 不卡大黄网站免费看| 日本中文字幕第一页| 中文国产成人精品| 日韩在线观看中文字幕| 国产青青在线视频| 中文字幕国产精品一区二区| 国产精品久久久久久在线| 午夜精品久久久久久99热软件| 奇米狠狠一区二区三区| 国产亚洲视频一区| 亚洲成av人**亚洲成av**| 国产高清视频在线| 97久久人人超碰caoprom欧美| 国产一区二区你懂的| 纪美影视在线观看电视版使用方法| 日韩三级精品电影久久久| 欧美xxxhd| 在线一区亚洲| av激情综合网| 一起草av在线| 91av视频在线| 999久久久免费精品国产| 国产日韩视频一区| 欧美日韩国产在线播放网站| 男女视频在线| 亚洲精品在线观看免费| www.欧美日韩| 国产精品一区二区三区在线免费观看 | 久久久国产成人| 亚洲天堂av高清| 风间由美一区二区av101| 色天使在线观看| 日韩欧美精品网址| av免费网站在线|