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

Android中JNI編程的那些事兒

移動開發 Android
JNI譯為Java本地接口。它允許Java代碼和其他語言編寫的代碼進行交互。在android中提供JNI的方式,讓Java程序可以調用C語言程序。android中很多Java類都具有native接口,這些接口由本地實現,然后注冊到系統中。

Android系統不允許一個純粹使用C/C++的程序出現,它要求必須是通過Java代碼嵌入Native C/C++——即通過JNI的方式來使用本地(Native)代碼。因此JNI對Android底層開發人員非常重要。

如何將.so文件打包到.APK

讓我們 先 從最簡單的情況開始,假如已有一個JNI實現——libxxx.so文件,那么如何在APK中使用它呢?

在我最初寫類似程序的時候,我會將libxxx.so文件push到/system/lib/目錄下,然后在Java代碼中執行System.loadLibrary(xxx),這是個可行的做法,但需要取得/system/lib 目錄 的寫權限(模擬器通過adb remount取得該權限)。但模擬器 重啟之 后libxxx.so文件會消失。現在 我找到了更好的方法,把.so文件打包到apk中分發給最終用戶,不管是模擬器 或者 真機 ,都不再需要system分區的寫權限。實現步驟如下:

1、在你的項目根目錄下建立libs/armeabi目錄;

2、將libxxx.so文件copy到 libs/armeabi/下;

3、此時ADT插件自動編譯輸出的.apk文件中已經包括.so文件了;

4、安裝APK文件,即可直接使用JNI中的方法;

我想還需要簡單說明一下libxxx.so的命名規則,沿襲Linux傳統,lib<something>.so是類庫文件名稱的格式,但在Java的System.loadLibrary(" something ")方法中指定庫名稱時,不能包括 前綴—— lib,以及后綴——.so。

準備編寫自己的JNI模塊

你一定想知道如何編寫自己的xxx.so,不過這涉及了太多有關JNI的知識。簡單的說:JNI是Java平臺定義的用于和宿主平臺上的本地代碼進行交互的“Java標準”,它通常有兩個使用場景:1.使用(之前使用c/c++、delphi開發的)遺留代碼;2.為了更好、更直接地與硬件交互并獲得更高性能 。

1、首先創建含有native方法的Java類:

  1. package com.okwap.testjni;     
  2.  public final class MyJNI {    
  3.     //native方法,    
  4.      public static native String sayHello(String name);    
  5. }   

2、通過javah命令生成.h文件,內容如下(com_okwap_testjni.h文件):

  1. /* DO NOT EDIT THIS FILE - it is machine generated */     
  2.  #include <jni.h>      
  3.  /* Header for class com_okwap_testjni_MyJNI */     
  4.  #ifndef _Included_com_okwap_testjni_MyJNI      
  5.  #define _Included_com_okwap_testjni_MyJNI      
  6.  #ifdef __cplusplus      
  7.  extern "C" {      
  8.  #endif      
  9.  /*     
  10.  * Class:     com_okwap_testjni_MyJNI     
  11.   * Method:    sayHello     
  12.   * Signature: (Ljava/lang/String;)Ljava/lang/String;     
  13.   */     
  14.  JNIEXPORT jstring JNICALL Java_com_okwap_testjni_MyJNI_sayHello      
  15.    (JNIEnv *, jclass, jstring);      
  16.  #ifdef __cplusplus      
  17.  }      
  18.  #endif     
  19.  #endif  

這是一個標準的C語言頭文件,其中的JNIEXPORT、JNICALL是JNI關鍵字(事實上它是沒有任何內容的宏,僅用于指示性說明),而jint、jstring是JNI環境下對int及java.lang.String類型的映射。這些關鍵字的定義都可以在jni.h中看到。

3、在 com_okwap_testjni.c文件中實現以上方法:

  1. #include <string.h>     
  2.  #include <jni.h>     
  3.  #include "com_okwap_testjni.h"     
  4.  JNIEXPORT jstring JNICALL Java_com_okwap_testjni_MyJNI_sayHello(JNIEnv* env, jclass, jstring str){     
  5.      //從jstring類型取得c語言環境下的char*類型     
  6.       const char* name = (*env)->GetStringUTFChars(env, str, 0);     
  7.      //本地常量字符串     
  8.       char* hello = "你好,";    
  9.      //動態分配目標字符串空間    
  10.      char* result = malloc((strlen(name) + strlen(hello) + 1)*sizeof(char));    
  11.      memset(result,0,sizeof(result));    
  12.      //字符串鏈接    
  13.       strcat(result,hello);    
  14.      strcat(result,name);    
  15.      //釋放jni分配的內存    
  16.      (*env)->ReleaseStringUTFChars(env,str,name);    
  17.      //生成返回值對象    
  18.      str = (*env)->NewStringUTF(env, "你好 JNI~!");    
  19.      //釋放動態分配的內存    
  20.      free(result);    
  21.     //   
  22.     return str;    
  23.  }   

#p#

4、編譯——兩種不同的編譯環境

以上的C語言代碼要編譯成最終.so動態庫文件,有兩種途徑:

Android NDK :全稱是Native Developer Kit,是用于編譯本地JNI源碼的工具,為開發人員將本地方法整合到Android應用中提供了方便。事實上NDK和完整源碼編譯環境一樣,都使用Android的編譯系統——即通過Android.mk文件控制編譯。NDK可以運行在Linux、Mac、Window(+cygwin)三個平臺上。有關NDK的使用方法及更多細節請參考以下資料:
 
eoe特刊第七期《NDK總結》http://blog.eoemobile.com/?p=27

http://androidappdocs.appspot.com/sdk/ndk/index.html ;

完整源碼編譯環境 :Android平臺提供有基于make的編譯系統,為App編寫正確的Android.mk文件就可使用該編譯系統。該環境需要通過git從官方網站獲取完整源碼副本并成功編譯,更多細節請參考:http://source.android.com/index.html

不管你選擇以上兩種方法的哪一個,都必須編寫自己的Android.mk文件,有關該文件的編寫請參考相關文檔。

JNI組件的入口函數——JNI_OnLoad()、JNI_OnUnload()

JNI組件被成功加載和卸載時,會進行函數回調,當VM執行到System.loadLibrary(xxx)函數時,首先會去執行JNI組件中的JNI_OnLoad()函數,而當VM釋放該組件時會呼叫JNI_OnUnload()函數。先看示例代碼:

  1. //onLoad方法,在System.loadLibrary()執行時被調用     
  2. jint JNI_OnLoad(JavaVM* vm, void* reserved){     
  3.     LOGI("JNI_OnLoad startup~~!");     
  4.         return JNI_VERSION_1_4;     
  5. }        
  6.      
  7. //onUnLoad方法,在JNI組件被釋放時調用     
  8. void JNI_OnUnload(JavaVM* vm, void* reserved){     
  9.     LOGE("call JNI_OnUnload ~~!!");    
  10. }   

JNI_OnLoad()有兩個重要的作用:

指定JNI版本:告訴VM該組件使用那一個JNI版本(若未提供JNI_OnLoad()函數,VM會默認該使用最老的JNI 1.1版),如果要使用新版本的JNI,例如JNI 1.4版,則必須由JNI_OnLoad()函數返回常量JNI_VERSION_1_4(該常量定義在jni.h中) 來告知VM。

初始化設定,當VM執行到System.loadLibrary()函數時,會立即先呼叫JNI_OnLoad()方法,因此在該方法中進行各種資源的初始化操作最為恰當。

JNI_OnUnload()的作用與JNI_OnLoad()對應,當VM釋放JNI組件時會呼叫它,因此在該方法中進行善后清理,資源釋放的動作最為合適。

使用registerNativeMethods方法

對Java程序員來說,可能我們總是會遵循:1.編寫帶有native方法的Java類;--->2.使用javah命令生成.h頭文件;--->3.編寫代碼實現頭文件中的方法,這樣的“官方” 流程,但也許有人無法忍受那“丑陋”的方法名稱,RegisterNatives方法能幫助你把c/c++中的方法隱射到Java中的native方法,而無需遵循特定的方法命名格式。來看一段示例代碼吧:

  1. //定義目標類名稱     
  2. static const char *className = "com/okwap/testjni/MyJNI";     
  3. //定義方法隱射關系    
  4. static JNINativeMethod methods[] = {     
  5.   {"sayHello", "(Ljava/lang/String;)Ljava/lang/String;", (void*)sayHello},     
  6. };     
  7. jint JNI_OnLoad(JavaVM* vm, void* reserved){    
  8.   //聲明變量    
  9.   jint result = JNI_ERR;    
  10.   JNIEnv* env = NULL;    
  11.   jclass clazz;    
  12.  int methodsLenght;    
  13.   //獲取JNI環境對象    
  14.   if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {    
  15.  LOGE("ERROR: GetEnv failed\n");    
  16.     return JNI_ERR;    
  17.   }    
  18.   assert(env != NULL);    
  19.   //注冊本地方法.Load 目標類    
  20.   clazz = (*env)->FindClass(env,className);    
  21.   if (clazz == NULL) {    
  22.     LOGE("Native registration unable to find class '%s'", className);    
  23.    return JNI_ERR;    
  24.   }    
  25.   //建立方法隱射關系    
  26.   //取得方法長度    
  27.   methodsLenght = sizeof(methods) / sizeof(methods[0]);    
  28.   if ((*env)->RegisterNatives(env,clazz, methods, methodsLenght) < 0) {    
  29.     LOGE("RegisterNatives failed for '%s'", className);    
  30.     return JNI_ERR;    
  31.   }    
  32.   //    
  33.  result = JNI_VERSION_1_4;    
  34.   return result;     
  35. }   

#p#

建立c/c++方法和Java方法之間映射關系的關鍵是 JNINativeMethod 結構,該結構定義在jni.h中,具體定義如下:

  1. typedef struct {     
  2.    const char* name;//java方法名稱    
  3.    const char* signature; //java方法簽名    
  4.    void*       fnPtr;//c/c++的函數指針    
  5.  } JNINativeMethod 

參照上文示例中初始化該結構的代碼:

  1. //定義方法隱射關系    
  2.  static JNINativeMethod methods[] = {    
  3.    {"sayHello", "(Ljava/lang/String;)Ljava/lang/String;", (void*)sayHello},    
  4.  };   

 其中比較難以理解的是第二個參數——signature字段的取值,實際上這些字符與函數的參數類型/返回類型一一對應,其中"()" 中的字符表示參數,后面的則代表返回值。例如"()V" 就表示void func(),"(II)V" 表示 void func(int, int),具體的每一個字符的對應關系如下:

字符     Java類型     C/C++類型
V           void          void
Z         jboolean      boolean
I            jint            int
J           jlong          long
D         jdouble       double
F          jfloat          float
B          jbyte          byte
C          jchar           char
S          jshort         short

數組則以"["開始,用兩個字符表示:

字符     java類型          c/c++類型
[Z     jbooleanArray      boolean[]
[I        jintArray            int[]
[F       jfloatArray         float[]
[B      jbyteArray          byte[]
[C      jcharArray          char[]
[S      jshortArray         short[]
[D     jdoubleArray       double[]
[J        jlongArray          long[]

上面的都是基本類型,如果參數是Java類,則以"L"開頭,以";"結尾,中間是用"/"隔開包及類名,而其對應的C函數的參數則為jobject,一個例外是String類,它對應C類型jstring,例如:Ljava/lang /String; 、Ljava/net/Socket; 等,如果JAVA函數位于一個嵌入類(也被稱為內部類),則用$作為類名間的分隔符,例如:"Landroid/os/FileUtils$FileStatus;"。

使用registerNativeMethods方法不僅僅是為了改變那丑陋的長方法名,最重要的是可以提高效率,因為當Java類別透過VM呼叫到本地函數時,通常是依靠VM去動態尋找.so中的本地函數(因此它們才需要特定規則的命名格式),如果某方法需要連續呼叫很多次,則每次都要尋找一遍,所以使用RegisterNatives將本地函數向VM進行登記,可以讓其更有效率的找到函數。

registerNativeMethods方法的另一個重要用途是,運行時動態調整本地函數與Java函數值之間的映射關系,只需要多次調用registerNativeMethods()方法,并傳入不同的映射表參數即可。

JNI中的日志輸出

你一定非常熟悉在Java代碼中使用Log.x(TAG,“message”)系列方法,在c/c++代碼中也一樣,不過首先你要include相關頭文件。遺憾的是你使用不同的編譯環境( 請參考上文中兩種編譯環境的介紹) ,對應的頭文件略有不同。。

如果是在完整源碼編譯環境下,只要include <utils/Log.h>頭文件,就可以使用對應的LOGI、LOGD等方法了,同時請定義LOG_TAG,LOG_NDEBUG等宏值,示例代碼如下:

  1.  #define LOG_TAG "HelloJni"     
  2.  #define LOG_NDEBUG 0     
  3.  #define LOG_NIDEBUG 0     
  4.  #define LOG_NDDEBUG 0    
  5.  #include <string.h>     
  6.  #include <jni.h>     
  7.  #include <utils/Log.h>    
  8.  jstring Java_com_inc_android_ime_HelloJni_stringFromJNI(JNIEnv* env,jobject thiz){    
  9.     LOGI("Call stringFromJNI!\n");   
  10.      return (*env)->NewStringUTF(env, "Hello from JNI (中文)!");    
  11. }   

與日志相關的.h頭文件,在以下源碼路徑:

  1. myeclair\frameworks\base\include\utils\Log.h   
  2. myeclair\system\core\include\cutils\log.h  


如果你是在NDK環境下編譯,則需要#include <android/log.h>,示例代碼如下:

  1.  /*    
  2.  * jnilogger.h    
  3.  *    
  4.  *  Created on: 2010-11-15    
  5.  *      Author: INC062805   
  6.  */     
  7.  #ifndef __JNILOGGER_H_     
  8.  #define __JNILOGGER_H_    
  9. #include <android/log.h>   
  10.  #ifdef _cplusplus    
  11.  extern "C" {    
  12.  #endif    
  13.  #ifndef LOG_TAG    
  14.  #define LOG_TAG    "MY_LOG_TAG"    
  15. #endif    
  16.  #define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)    
  17.  #define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)    
  18.  #define LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)    
  19.  #define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)    
  20.  #define LOGF(...)  __android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__)    
  21.  #ifdef __cplusplus    
  22.  }   
  23.  #endif    
  24.  #endif /* __JNILOGGER_H_ */   

你可以下載以上頭文件,來統一兩種不同環境下的使用差異。另外,不要忘了在你的Android.mk文件中加入對類庫的應用,兩種環境下分別是

 ifeq ($(HOST_OS),windows)  
 #NDK環境下  
     LOCAL_LDLIBS := -llog  
 else 
 #完整源碼環境下  
     LOCAL_SHARED_LIBRARIES := libutils  
 endif

Android為JNI提供的助手方法

  1. myeclair\dalvik\libnativehelper\include\nativehelper 

在完整源碼編譯環境下,Android在myeclair\dalvik\libnativehelper\include\nativehelper\JNIHelp.h頭文件中 提供了助手函數 ,用于本地方法注冊、異常處理等任務,還有一個用于計算方法隱射表長度的宏定義:

  1. #ifndef NELEM    
  2.  # define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))    
  3.  #endif    
  4.  //有了以上宏定義后,注冊方法可以按如下寫,該宏定義可以直接copy到NDK環境下使用:    
  5.  (*env)->RegisterNatives(env,clazz, methods,NELEM(methods));

【編輯推薦】

Android四種Activity的加載模式

Android網絡連接處理學習筆記

Sidekick的故事:從Danger到Android

Android Activity和Intent機制學習筆記

Android用戶界面設計之創建列表視圖程序

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-02-16 09:57:41

2022-11-04 07:57:59

編程編碼編譯器

2024-08-12 08:41:40

2012-07-19 15:30:00

Linux

2011-02-16 11:49:06

2011-02-16 13:10:40

Android交互設計

2020-05-20 14:25:45

Reactreact.js前端

2011-09-16 10:05:48

Android應用Nightclub S夜店

2023-04-11 07:34:40

分布式系統算法

2021-03-18 09:01:53

軟件開發軟件選型

2019-11-14 15:38:46

AndroidRelease項目

2022-07-10 07:48:26

緩存軟件設計

2011-02-25 14:35:00

2022-02-08 17:39:04

MySQL服務器存儲

2018-09-26 06:50:19

2021-06-02 08:33:31

TPCTPC-H系統

2013-12-26 14:23:03

定位系統GPS監測

2021-06-09 13:28:40

密碼安全身份認證數據安全

2018-02-02 13:58:59

數據存儲

2022-08-04 10:18:32

棧遷移?寄存器內存
點贊
收藏

51CTO技術棧公眾號

中文字幕人妻一区二区三区视频| 中文字幕乱码在线| 2024短剧网剧在线观看| 国产精品一二三四五| 国模私拍一区二区三区| 性久久久久久久久久久| 国产精品成人国产| 亚洲国产va精品久久久不卡综合| 麻豆亚洲一区| 国产精品女同一区二区| 野花国产精品入口| 色综合亚洲精品激情狠狠| 在线观看一区二区三区四区| 亚洲www啪成人一区二区| 亚洲精品视频在线| 欧美高清视频一区| 国产黄a三级三级三级| 国产一区二区精品| 久久国产色av| 美女洗澡无遮挡| 777久久精品| 欧美性videosxxxxx| 欧日韩免费视频| 伊人在线视频| 久久女同互慰一区二区三区| 成人免费网站在线| 黄色在线视频网址| 亚洲图片在线| 欧美成人精品h版在线观看| 麻豆精品免费视频| 欧美色图婷婷| 亚洲а∨天堂久久精品喷水| 福利视频999| 成人精品三级| 色综合久久天天| 日韩精品综合在线| 久久99精品久久| 国产精品午夜电影| 欧美精品一区在线发布| 殴美一级特黄aaaaaa| 国产成人亚洲综合a∨婷婷| 国产在线播放不卡| 人人妻人人爽人人澡人人精品| 禁久久精品乱码| 欧美成人在线免费视频| 韩国一级黄色录像| 91亚洲国产高清| 在线看欧美日韩| 久久精品成人av| 日本午夜精品| 日韩精品视频在线观看网址| 91丨porny丨对白| 粉嫩av一区二区| 日韩欧美久久久| 中文字幕人妻熟女人妻a片| 亚洲毛片在线免费| 91精品在线观看入口| 日本美女视频一区| 国产午夜亚洲精品一级在线| 这里只有精品免费| www.久久com| 日韩欧美一级| 欧美精品一区二区高清在线观看| 美女久久久久久久久| 白白在线精品| 日韩电影在线观看永久视频免费网站| 丰满少妇一区二区三区| 一区二区三区日本久久久| 亚洲性av网站| 国产精品理论在线| 小处雏高清一区二区三区| 久久中文字幕国产| 国产亚洲小视频| 在线亚洲国产精品网站| 青青久久aⅴ北条麻妃| 亚洲第一网站在线观看| 六月丁香婷婷色狠狠久久| 国产日韩在线播放| 国产夫妻自拍av| zzijzzij亚洲日本少妇熟睡| 另类视频在线观看+1080p| 久草在线网址| 亚洲丝袜制服诱惑| 18禁网站免费无遮挡无码中文| 国产精品yjizz视频网| 色狠狠一区二区三区香蕉| 亚洲一级片免费| 亚洲精品a区| 亚洲精品在线看| 亚洲区一区二区三| 在线亚洲一区| 国产日韩中文字幕| 欧美视频一二区| 国产女主播一区| 欧美一级中文字幕| 日韩美女在线看免费观看| 91精品国产免费| 日本人妻一区二区三区| 欧美先锋资源| 欧美激情一区二区三级高清视频| 亚洲黄色三级视频| 激情欧美一区二区| 精品欧美国产| 午夜不卡视频| 欧美性xxxx| 992tv人人草| 国产毛片一区二区三区| 欧美人交a欧美精品| 中文 欧美 日韩| 成人一区二区三区视频| 亚洲欧美日韩国产成人综合一二三区| 人人超在线公开视频| 欧美在线一二三四区| 色婷婷精品久久二区二区密| 欧美电影一区| 热99久久精品| 丰满熟妇乱又伦| 中文字幕一区二区三区在线不卡 | 一本久久a久久精品亚洲 | 成人在线综合网| 在线观看免费91| 日韩另类视频| 日韩av在线不卡| 精品一区在线视频| 国内精品伊人久久久久av影院 | 国产精品久久久久久网站| 国产综合在线播放| 亚洲人吸女人奶水| 99sesese| jiujiure精品视频播放| 国产91|九色| 人妻va精品va欧美va| 亚洲欧美区自拍先锋| 妺妺窝人体色www在线观看| 欧美成人一区在线观看| 欧美黑人性视频| 国产欧美久久久精品免费| 中文字幕精品一区二区三区精品| 18禁男女爽爽爽午夜网站免费| 91久久精品无嫩草影院| 蜜臀久久99精品久久久无需会员 | 国产一区二区在线看| 一级特黄录像免费播放全99| 日韩中文在线播放| 亚洲一区二区久久| 最近日韩免费视频| 国产精品视频观看| 久久国产这里只有精品| 青青草国产免费一区二区下载| 日本一区二区不卡| 国产精品久久久久一区二区国产| 在线免费观看日韩欧美| 国产精品理论在线| 久久精品久久久精品美女| 一区二区三区四区| 日韩电影精品| 不卡av电影在线观看| 国产伦理吴梦梦伦理| 中文字幕一区二| 亚洲一二区在线观看| 欧美日本一区二区高清播放视频| 96成人在线视频| 好吊日av在线| 亚洲黄页网在线观看| 4438国产精品一区二区| 日本一区二区三区四区| jizz欧美激情18| 99精品视频在线观看免费播放| 成人伊人精品色xxxx视频| h片在线观看网站| 精品播放一区二区| 久久国产视频精品| 中文在线资源观看网站视频免费不卡 | 欧美在线啊v一区| 性爱在线免费视频| 国产精品91一区二区| 99热亚洲精品| 精品国产一区二区三区香蕉沈先生| 国产综合久久久久久| 成人av黄色| 精品在线小视频| 中文字幕在线播放av| 亚洲精品福利视频网站| 国产老熟女伦老熟妇露脸| 视频一区在线视频| 国产精品久久成人免费观看| 久久精品福利| 国产精品永久免费| 国产探花视频在线观看| 亚洲欧洲黄色网| 国产熟女精品视频| 日韩欧美亚洲范冰冰与中字| 久久久久久久麻豆| aaa国产一区| 超碰成人在线播放| 国产欧美欧美| 最新国产精品久久| 亚洲国产国产| 亚洲自拍偷拍一区| 成人免费av电影| 国内成人精品视频| 麻豆视频在线免费观看| 亚洲精品久久久久久久久久久久久| 在线视频 中文字幕| 亚洲h精品动漫在线观看| 无码人中文字幕| 91网站黄www| 亚洲国产精品第一页| 青青草国产精品亚洲专区无| 国产精品成人久久电影| 99久久.com| 日韩影片在线播放| 老牛国内精品亚洲成av人片| 成人欧美一区二区三区黑人| 欧美大片高清| 国产91精品久久久| 久久香蕉av| 久久精品国产精品亚洲| 成年网站在线| 日韩久久免费电影| 日日躁夜夜躁白天躁晚上躁91| 欧美精品高清视频| 波多野结衣人妻| 精品久久久香蕉免费精品视频| 动漫性做爰视频| 国产精品女上位| mm131丰满少妇人体欣赏图| caoporm超碰国产精品| 无人码人妻一区二区三区免费| 毛片不卡一区二区| 美女一区二区三区视频| 久久av一区二区三区| 男人添女人下面高潮视频| 欧美午夜免费影院| 欧美日韩午夜爽爽| 91精品高清| 天天成人综合网| 99久久精品网站| 伊人婷婷久久| 国产精品99视频| 一本久久a久久精品vr综合| 第一会所sis001亚洲| 亚洲精品欧洲精品| 日韩欧美精品| 中文字幕久久综合| 91精品二区| 国产精品无码电影在线观看| 欧美午夜a级限制福利片| 日本久久久网站| 亚洲区一区二| 91视频最新入口| 久久亚洲视频| 亚洲天堂av线| 久久激情综合网| www.污网站| 风流少妇一区二区| 国模私拍在线观看| 99久久99久久综合| 伊人网在线视频观看| 国产亚洲精品免费| 萌白酱视频在线| 亚洲欧美日韩在线| 久久久久久久中文字幕| 精品久久久久久久久久久久久久 | 日韩av成人高清| 黄色永久免费网站| 国产一区二区三区蝌蚪| 久久av一区二区三| 99久久国产综合精品色伊| 西西444www无码大胆| 国产精品国产三级国产aⅴ无密码| 很污很黄的网站| 夜夜夜精品看看| wwwxxx亚洲| 欧美亚洲国产一区二区三区| 国产乱码精品一区二区| 亚洲激情 国产| av成人手机在线| 欧美黑人一区二区三区| 久久uomeier| 国产在线不卡精品| 韩国精品福利一区二区三区| 欧美午夜欧美| 91成人精品| 久久综合九色综合88i| 蜜桃视频在线观看一区二区| 日本女人性视频| 久久嫩草精品久久久久| 性欧美videos| 日韩欧美精品网址| 国产成人三级在线播放 | 色天天综合久久久久综合片| 一区二区日韩视频| 亚洲高清一二三区| 国产无套粉嫩白浆在线2022年| www国产精品com| 日本乱码一区二区三区不卡| 国产精品亚洲一区二区三区| 久9re热视频这里只有精品| 亚洲在线不卡| 久久蜜桃资源一区二区老牛| 永久免费黄色片| 日本一区二区三区dvd视频在线 | www久久99| 青草国产精品| 国产a级一级片| 夫妻av一区二区| 亚洲色图欧美色| 色综合网站在线| 亚洲av无码国产精品永久一区| 中日韩午夜理伦电影免费| 黄色视屏在线免费观看| 91视频国产一区| 日韩www.| 波多野结衣家庭教师视频| 国产精品88888| 欧美日韩生活片| 好吊成人免视频| 亚洲女同志亚洲女同女播放| 日韩中文字在线| 成人国产精选| 日韩国产在线一区| 伊人天天综合| 绯色av蜜臀vs少妇| 国产精品国产三级国产aⅴ中文| 国产区一区二区三| 亚洲国产精久久久久久| 欧美性爽视频| 91视频免费在线观看| 亚洲人体av| 日韩av一卡二卡三卡| 国产精品九色蝌蚪自拍| 久久久999久久久| 亚洲欧美999| 中文在线а√在线8| 久久久久久久久四区三区| 日韩视频不卡| 无码一区二区精品| 婷婷六月综合网| 天堂网在线中文| 国模极品一区二区三区| 国产精品45p| 成年人网站国产| 成人深夜在线观看| 国产无遮挡又黄又爽又色| 精品国产成人系列| 成人观看网址| 九九九久久久| 久久av在线| 嘿嘿视频在线观看| 欧美日韩国产经典色站一区二区三区| 色三级在线观看| 成人在线免费观看视视频| **女人18毛片一区二区| 欧美色图校园春色| 亚洲一本大道在线| 少妇喷水在线观看| 欧美在线一区二区视频| 国产一区国产二区国产三区| 性欧美1819| 一区二区三区免费观看| 视频一区 中文字幕| 4444欧美成人kkkk| 国产欧美日韩在线一区二区| 91人人澡人人爽人人精品| 国产精品美日韩| 国产丝袜在线视频| 久久久久久国产免费| 偷拍一区二区| 2025韩国理伦片在线观看| 亚洲日本va在线观看| 日韩在线视频免费| 日韩av片免费在线观看| 欧美精品系列| 久久精品无码一区二区三区毛片| 亚洲电影一区二区三区| 青青视频在线观| 国产日本欧美一区| 欧美激情综合色综合啪啪| 熟女丰满老熟女熟妇| 欧美伊人久久大香线蕉综合69 | 成人不卡免费视频| 亚洲一区二区三区不卡国产欧美 | 久久综合久久鬼色| 夜夜骚av一区二区三区| 性视频1819p久久| 日韩精品一卡| 国产人妻黑人一区二区三区| 在线观看亚洲精品| 国产丝袜在线播放| 日韩高清国产精品| 成人久久18免费网站麻豆| 波多野结衣黄色| 欧美另类交人妖| 欧美日韩国产高清电影| 国产吃瓜黑料一区二区| 欧洲精品在线观看| av在线网页| 一本一道久久a久久综合精品| 99久久亚洲一区二区三区青草|