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

OPhone平臺Native開發與JNI機制詳解

移動開發
眾所周知,OPhone平臺上的應用開發主要基于Java語言,但平臺完全支持且提供了一定的Native開發能力(主要是C/C++),使得開發者可以借助JNI更深入的實現創意。本文主要介紹OPhone平臺的JNI機制和Native模塊開發與發布的方法。

JNI簡介

Java Native Interface(JNI)是Java提供的一個很重要的特性。它使得用諸如C/C++等語言編寫的代碼可以與運行于Java虛擬機(JVM)中的Java代碼集成。有些時候,Java并不能滿足你的全部開發需求,比如你希望提高某些關鍵模塊的效率,或者你必須使用某個以C/C++等Native語言編寫的程序庫;此時,JNI就能滿足你在Java代碼中訪問這些Native模塊的需求。JNI的出現使得開發者既可以利用Java語言跨平臺、類庫豐富、開發便捷等特點,又可以利用Native語言的高效。

實際上,JNI是JVM實現中的一部分,因此Native語言和Java代碼都運行在JVM的宿主環境(Host Environment),正如圖1所示。此外,JNI是一個雙向的接口:開發者不僅可以通過JNI在Java代碼中訪問Native模塊,還可以在Native代碼中嵌入一個JVM,并通過JNI訪問運行于其中的Java模塊??梢姡琂NI擔任了一個橋梁的角色,它將JVM與Native模塊聯系起來,從而實現了Java代碼與Native代碼的互訪。在OPhone上使用Java虛擬機是為嵌入式設備特別優化的Dalvik虛擬機。每啟動一個應用,系統會建立一個新的進程運行一個Dalvik虛擬機,因此各應用實際上是運行在各自的VM中的。Dalvik VM對JNI的規范支持的較全面,對于從JDK 1.2到JDK 1.6補充的增強功能也基本都能支持。

開發者在使用JNI之前需要充分了解其優缺點,以便合理選擇技術方案實現目標。JNI的優點前面已經講過,這里不再重復,其缺點也是顯而易見的:由于Native模塊的使用,Java代碼會喪失其原有的跨平臺性和類型安全等特性。此外,在JNI應用中,Java代碼與Native代碼運行于同一個進程空間內;對于跨進程甚至跨宿主環境的Java與Native間通信的需求,可以考慮采用socket、Web Service等IPC通信機制來實現。

在OPhone開發中使用JNI

正如我們在上一節所述,JNI是一個雙向的接口,所以交互的類型可以分為在Java代碼中調用Native模塊和在Native代碼中調用Java模塊兩種。下面,我們就使用一個Hello-JNI的示例來分別對這兩種交互方式的開發要點加以說明。

Java調用Native模塊

Hello-JNI這個示例的結構很簡單:首先我們使用Eclipse新建一個OPhone應用的Java工程,并添加一個com.example.hellojni.HelloJni的類。這個類實際上是一個Activity,稍后我們會創建一個TextView,并顯示一些文字在上面。

要在Java代碼中使用Native模塊,必須先對Native函數進行聲明。在我們的例子中,打開HelloJni.java文件,可以看到如下的聲明:#p#

  1. /* A native method that is implemented by the
  2. * 'hello-jni' native library, which is packaged
  3. * with this application.
  4. */
  5. public native String stringFromJNI();

從上述聲明中我們可以知道,這個stringFromJNI()函數就是要在Java代碼中調用的Native函數。接下來我們要創建一個hello-jni.c的C文件,內容很簡單,只有如下一個函數:

  1. #include <string.h>
  2. #include <jni.h>
  3. jstring
  4. Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
  5. jobject thiz ) {
  6. return (*env)->NewStringUTF(env, "Hello from JNI !");
  7. }

從函數名可以看出,這個Native函數對應的正是我們在com.example.hellojni.HelloJni這個中聲明的Native函數String stringFromJNI()的具體實現。

從上面Native函數的命名上我們可以了解到JNI函數的命名規則: Java代碼中的函數聲明需要添加native關鍵字;Native的對應函數名要以“Java_”開頭,后面依次跟上Java的“package名”、“class名”、“函數名”,中間以下劃線“_”分割,在package名中的“.”也要改為“_”。此外,關于函數的參數和返回值也有相應的規則。對于Java中的基本類型如int、double、char等,在Native端都有相對應的類型來表示,如jint、jdouble、jchar等;其他的對象類型則統統由jobject來表示(String是個例外,由于其使用廣泛,故在Native代碼中有jstring這個類型來表示,正如在上例中返回值String對應到Native代碼中的返回值jstring)。而對于Java中的數組,在Native中由jarray對應,具體到基本類型和一般對象類型的數組則有jintArray等和jobjectArray分別對應(String數組在這里沒有例外,同樣用jobjectArray表示)。還有一點需要注意的是,在JNI的Native函數中,其前兩個參數JNIEnv*和jobject是必需的——前者是一個JNIEnv結構體的指針,這個結構體中定義了很多JNI的接口函數指針,使開發者可以使用JNI所定義的接口功能;后者指代的是調用這個JNI函數的Java對象,有點類似于C++中的this指針。在上述兩個參數之后,還需要根據Java端的函數聲明依次對應添加參數。在上例中,Java中聲明的JNI函數沒有參數,則Native的對應函數只有類型為JNIEnv*和jobject的兩個參數。

當然,要使用JNI函數,還需要先加載Native代碼編譯出來的動態庫文件(在Windows上是.dll,在Linux上則為.so)。這個動作是通過如下語句完成的:

  1. static {
  2. System.loadLibrary("hello-jni");
  3. }

注意這里調用的共享庫名遵循Linux對庫文件的命名慣例,因為OPhone的核心實際上是Linux系統——上例中,實際加載的庫文件應為“libhello-jni.so”,在引用時遵循命名慣例,不帶“lib”前綴和“.so”的擴展名。對于沒有按照上述慣例命名的Native庫,在加載時仍需要寫成完整的文件名。

JNI函數的使用方法和普通Java函數一樣。在本例中,調用代碼如下:

  1. TextView tv = new TextView(this);
  2. tv.setText( stringFromJNI() );
  3. setContentView(tv);

就可以在TextView中顯示出來自于Native函數的字符串。怎么樣,是不是很簡單呢?

Native調用Java模塊

從OPhone的系統架構來看,JVM和Native系統庫位于內核之上,構成OPhone Runtime;更多的系統功能則是通過在其上的Application Framework以Java API的形式提供的。因此,如果希望在Native庫中調用某些系統功能,就需要通過JNI來訪問Application Framework提供的API。#p#

JNI規范定義了一系列在Native代碼中訪問Java對象及其成員與方法的API。下面我們還是通過示例來具體講解。首先,新建一個SayHello的類,代碼如下:

  1. package com.example.hellojni;
  2. public class SayHello {
  3. public String sayHelloFromJava(String nativeMsg) {
  4. String str = nativeMsg + " But shown in Java!";
  5. return str;
  6. }
  7. }

接下來要實現的就是在Native代碼中調用這個SayHello類中的sayHelloFromJava方法。

一般來說,要在Native代碼中訪問Java對象,有如下幾個步驟:

1. 得到該Java對象的類定義。JNI定義了jclass這個類型來表示Java的類的定義,并提供了FindClass接口,根據類的完整的包路徑即可得到其jclass。

2. 根據jclass創建相應的對象實體,即jobject。在Java中,創建一個新對象只需要使用new關鍵字即可,但在Native代碼中創建一個對象則需要兩步:首先通過JNI接口GetMethodID得到該類的構造函數,然后利用NewObject接口構造出該類的一個實例對象。

3. 訪問jobject中的成員變量或方法。訪問對象的方法是先得到方法的Method ID,然后使用CallMethod接口調用,這里Type對應相應方法的返回值——返回值為基本類型的都有相對應的接口,如CallIntMethod;其他的返回值(包括String)則為CallObjectMethod。可以看出,創建對象實質上是調用對象的一個特殊方法,即構造函數。訪問成員變量的步驟一樣:首先GetFieldID得到成員變量的ID,然后Get/SetField讀/寫變量值。

上面概要介紹了從Native代碼中訪問Java對象的過程,下面我們結合示例來具體看一下。如下是調用sayHelloFromJava方法的Native代碼:

  1. jstring helloFromJava( JNIEnv* env ) {
  2. jstring str = NULL;
  3. jclass clz = (*env)->FindClass(env, "com/example/hellojni/SayHello");
  4. jmethodID ctor = (*env)->GetMethodID(env, clz, "<init>", "()V");
  5. jobject obj = (*env)->NewObject(env, clz, ctor);
  6. jmethodID mid = (*env)->GetMethodID(env, clz, "sayHelloFromJava", "(Ljava/lang/String;)Ljava/lang/String;");
  7. if (mid) {
  8. jstring jmsg = (*env)->NewStringUTF(env, "I'm born in native.");
  9. str = (*env)->CallObjectMethod(env, obj, mid, jmsg);
  10. }
  11. return str;
  12. }

可以看到,上述代碼和前面講到的步驟完全相符。這里提一下編程時要注意的要點:1、FindClass要寫明Java類的完整包路徑,并將“.”以“/”替換;2、GetMethodID的第三個參數是方法名(對于構造函數一律用“”表示),第四個參數是方法的“簽名”,需要用一個字符串序列表示方法的參數(依聲明順序)和返回值信息。由于篇幅所限,這里不再具體說明如何根據方法的聲明構造相應的“簽名”,請參考JNI的相關文檔。

關于上面談到的步驟再補充說明一下:在JNI規范中,如上這種使用NewObject創建的對象實例被稱為“Local Reference”,它僅在創建它的Native代碼作用域內有效,因此應避免在作用域外使用該實例及任何指向它的指針。如果希望創建的對象實例在作用域外也能使用,則需要使用NewGlobalRef接口將其提升為“Global Reference”——需要注意的是,當Global Reference不再使用后,需要顯式的釋放,以便通知JVM進行垃圾收集。

Native模塊的編譯與發布

通過前面的介紹,我們已經大致了解了在OPhone的應用開發中使用JNI的方法。那么,開發者如何編譯出能在OPhone上使用的Native模塊呢?編譯出的Native模塊又如何像APK文件那樣分發、安裝呢?

Google于2009年6月底發布了Android NDK的***個版本,為廣大開發者提供了編譯用于Android應用的Native模塊的能力,以及將Native模塊隨Java應用打包為APK文件,以便分發和安裝的整套解決方案。NDK的全稱是Native Development Toolkit,即原生應用開發包。由于OPhone平臺也基于Android,因此使用Android NDK編譯的原生應用或組件完全可以用于OPhone。需要注意的是,Google聲稱此次發布的NDK僅兼容于Android 1.5及以后的版本,由于OPhone 1.0平臺基于Android 1.5之前的版本,雖然不排除使用該NDK開發的原生應用或組件在OPhone 1.0平臺上正常運行的可能性,但建議開發者僅在OPhone 1.5及以上的平臺使用。#p#

***版本的NDK可以在http://developer.android.com/sdk/ndk/index.html下載。NDK提供了適用于Windows、Linux和MAC OS X的版本,開發者可以根據自己的操作系統下載相應的版本。本文僅使用基于Linux的NDK版本做介紹和演示。

NDK的安裝很簡單:解壓到某個路徑下即可,之后可以看到若干目錄。其中docs目錄中包含了比較詳細的文檔,可供開發者參考,在NDK根目錄下的README.TXT也對個別重要文檔進行了介紹;build目錄則包含了用于Android設備的交叉編譯器和相關工具,以及一組系統頭文件和系統庫,其中包括libc、libm、libz、liblog(用于Android設備log輸出)、JNI接口及一個C++標準庫的子集(所謂“子集”是指Android對C++支持有限,如不支持Exception及STL等);apps目錄是用于應用開發的目錄,out目錄則用于編譯中間結果的存儲。接下來,我們就用前面的例子簡單講解一下NDK的使用。

進入/apps目錄,我們可以看到一些示例應用,以hello-jni為例:在hello-jni目錄中有一個Application.mk文件和一個project文件夾,project文件夾中則是一個OPhone Java應用所有的工程文件,其中jni目錄就是Native代碼放置的位置。這里Application.mk主要用于告訴編譯器應用所需要用到的Native模塊有什么,對于一般開發在示例提供的文件的基礎上進行修改即可;如果需要了解更多,可參考/docs/APPLICATION-MK.txt。接下來,我們將示例文件與代碼如圖2放置到相應的位置:

可以看到,和Java應用一樣,Native模塊也需要使用Android.mk文件設置編譯選項和參數,但內容有較大不同。對于Native模塊而言,一般需要了解如下幾類標簽:

1.LOCAL_MODULE:定義了在整個編譯環境中的各個模塊,其名字應當是唯一的。此外,這里設置的模塊名稱還將作為編譯出來的文件名:對于原生可執行文件,文件名即為模塊名稱;對于靜態/動態庫文件,文件名為lib+模塊名稱。例如hello-jni的模塊名稱為“hello-jni”,則編譯出來的動態庫就是libhello-jni.so。

2.LOCAL_SRC_FILES:這里要列出所有需要編譯的C/C++源文件,以空格或制表符分隔;如需換行,可放置“\”符號在行尾,這和GNU Makefile的規則是一致的。

3.LOCAL_CFLAGS:定義gcc編譯時的CFLAGS參數,與GNU Makefile的規則一致。比如,用-I參數可指定編譯所需引用的某個路徑下的頭文件。

4.LOCAL_C_INCLUDES:指定自定義的頭文件路徑。

5.LOCAL_SHARED_LIBRARIES:定義鏈接時所需要的共享庫文件。這里要鏈接的共享庫并不限于NDK編譯環境中定義的所有模塊。如果需要引用其他的庫文件,也可在此處指定。

6.LOCAL_STATIC_LIBRARIES:和上個標簽類似,指定需要鏈接的靜態庫文件。需要注意的是這個選項只有在編譯動態庫的時候才有意義。

7.LOCAL_LDLIBS:定義鏈接時需要引入的系統庫。使用時需要加-l前綴,例如-lz指的是在加載時鏈接libz這個系統庫。libc、libm和libstdc++是編譯系統默認會鏈接的,無需在此標簽中指定。

欲了解更多關于標簽類型及各類標簽的信息,可參考/docs/ANDROID-MK.txt文件,其中詳細描述了Android.mk中各個標簽的含義與用法。如下給出的就是我們的示例所用的Android.mk:

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := hello-jni
  4. LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
  5. LOCAL_SRC_FILES := src/call_java.c \
  6. src/hello-jni.c
  7. include $(BUILD_SHARED_LIBRARY)

寫好了代碼和Makefile,接下來就是編譯了。使用NDK進行編譯也很簡單:首先從命令行進入目錄,執行./build/host-setup.sh,當打印出“Host setup complete.”的文字時,編譯環境的設置就完成了。這里開發者需要注意的是,如果使用的Linux發行版是Debian或者Ubuntu,需要通過在目錄下執行bash build/host-setup.sh,因為上述兩個發行版使用的dash shell與腳本有兼容問題。接下來,輸入make APP=hello-jni,稍等片刻即完成編譯,如圖3所示。從圖中可以看到,在編譯完成后,NDK會自動將編譯出來的共享庫拷貝到Java工程的libs/armeabi目錄下。當編譯Java工程的時候,相應的共享庫會被一同打包到apk文件中。在應用安裝時,被打包在libs/armeabi目錄中的共享庫會被自動拷貝到/data/data/com.example.HelloJni/lib/目錄;當System.loadLibrary被調用時,系統就可以在上述目錄尋找到所需的庫文件libhello-jni.so。如果實際的Java工程不在這里,也可以手動在Java工程下創建libs/armeabi目錄,并將編譯出來的so庫文件拷貝過去。

***,將Java工程連帶庫文件一同編譯并在OPhone模擬器中運行,結果如圖4所示。

通過上面的介紹,你應該已經對OPhone上的Native開發有了初步了解,或許也已經躍躍欲試了。事實上,盡管Native開發在OPhone上不具有Java語言的類型安全、兼容性好、易于調試等特性,也無法直接享受平臺提供的豐富的API,但JNI還是為我們提供了更多的選擇,使我們可以利用原生應用的優勢來做對性能要求高的操作,也可以利用或移植C/C++領域現有的眾多功能強大的類庫或應用,為開發者提供了充分的施展空間。這就是OPhone的魅力!

【編輯推薦】

  1. Android/OPhone開發完全講義
  2. 云計算應用與Ophone是終端基礎設施
  3. 1.3.1 OPhone介紹
  4. Android系統平臺與OPhone之間的對攻戰
  5. 7.1.3 OPhone平臺支持的媒體格式
責任編輯:chenqingxiang 來源: ophonesdn
相關推薦

2010-07-23 15:30:18

2010-03-04 16:08:21

Android系統平臺

2021-09-23 14:41:58

鴻蒙HarmonyOS應用

2010-07-26 15:47:02

Ophone系統

2010-09-17 10:18:59

ODTOPhone

2010-07-23 16:08:38

OPhone平臺

2009-03-26 08:26:22

AndroidGoogle移動OS

2023-02-09 07:15:52

開發FlutterReact

2010-07-26 12:57:12

OPhone游戲開發

2009-04-10 08:42:38

OMS移動OSophone

2024-04-18 08:27:05

Android數據類型

2010-07-26 13:55:10

OPhone游戲開發

2010-07-26 14:44:47

Widget開發

2010-07-26 14:25:06

Widget開發

2024-11-07 09:37:46

2009-05-07 08:32:59

中國移動OphoneAndroid

2010-07-26 12:33:04

控件

2011-08-18 10:59:57

iPhone開發消息通信NSNotificat

2012-05-25 09:09:25

Windows Pho

2009-06-15 15:16:00

netbeans sw平臺開發
點贊
收藏

51CTO技術棧公眾號

久久久久久久性| 99精品免费视频| 欧美一级日韩免费不卡| 美女av免费观看| 亚洲aaaaaaa| 麻豆精品视频在线观看| 麻豆国产欧美一区二区三区| 国产一区二区三区在线看| 亚洲欧美手机在线| av免费不卡国产观看| 国产女人18毛片水真多成人如厕| 2019国产精品视频| 无码日韩精品一区二区| 你懂的视频一区二区| 亚洲激情视频在线观看| 91 在线视频观看| 国产精品原创| 综合久久国产九一剧情麻豆| 国产日韩三区| 国产精品久久久久久久成人午夜| 99xxxx成人网| 欧美精品在线免费播放| 国产精品无码久久久久久| 日本免费在线一区| 色一情一乱一乱一91av| 91精品一区二区三区四区| 精品成人一区二区三区免费视频| 国产成人精品一区二区三区四区| 国产成人精品网站| 国产精品成人免费一区二区视频| 99久久久国产精品美女| 日韩成人中文电影| 国产精品99久久久精品无码| 国产乱子精品一区二区在线观看| 欧美日韩国产在线看| 欧美xxxx吸乳| 日本中文字幕在线播放| 久久久久久久免费视频了| 国产专区一区二区| 亚洲精品无码专区| 国产伦理精品不卡| 国产综合久久久久久| 在线视频精品免费| 老司机免费视频久久| 亚洲91精品在线观看| 欧美丰满艳妇bbwbbw| 天天综合一区| www.欧美三级电影.com| 永久免费毛片在线观看| 嫩草影视亚洲| 亚洲欧美激情四射在线日| 超碰caoprom| av综合网址| 欧美成人女星排名| 国产麻豆剧传媒精品国产| 国产精品一区二区精品| 91精品国产美女浴室洗澡无遮挡| 黄色一级片免费的| 婷婷久久免费视频| 欧美一二三在线| 超级砰砰砰97免费观看最新一期| 久久精品一级| 精品久久人人做人人爽| 日本一级大毛片a一| 999精品视频在这里| 精品国产乱码91久久久久久网站| 亚洲色图欧美另类| 精品亚洲精品| 国产丝袜视频一区| 美女爆乳18禁www久久久久久| 久久99影视| 日韩中文字幕精品| 高h视频免费观看| 欧美先锋影音| 88xx成人精品| 国模私拍一区二区| 精品一区二区三区在线观看| 91日韩在线播放| 亚洲精品无码专区| 久久免费美女视频| 亚洲午夜精品一区二区| 69成人在线| 欧美日韩国产一中文字不卡| 国产主播中文字幕| 亚洲第一二区| 亚洲精品视频免费在线观看| 色婷婷国产精品免| 午夜久久久久| 国产不卡av在线免费观看| 亚洲中文无码av在线| 国产精品亚洲人在线观看| 国产精品露出视频| 国产区视频在线| 亚洲激情五月婷婷| 日韩人妻精品无码一区二区三区| 国模私拍国内精品国内av| 日韩免费高清视频| 级毛片内射视频| 欧美日韩国产精品一区二区亚洲| 欧美在线视频一区二区| 国产精品一级视频| 91老司机福利 在线| youjizz.com亚洲| 黄在线观看免费网站ktv| 欧美日韩在线精品一区二区三区激情 | 国产精品人人妻人人爽| av电影天堂一区二区在线| 麻豆9191精品国产| 国产精品色婷婷视频| 国产综合在线播放| 国产成人天天5g影院在线观看| 国产偷国产偷亚洲高清人白洁 | jizz在线观看| 亚洲一区二区三区国产| 国产一伦一伦一伦| 天堂成人娱乐在线视频免费播放网站 | 国产精品婷婷| 亚洲mm色国产网站| 国产二区视频在线观看| 亚洲18女电影在线观看| 天天综合成人网| 精品国产一区二区三区四区| 久久久久久久久国产精品| 亚洲天堂中文网| 久久色成人在线| www精品久久| 国内精品视频| 色悠悠久久久久| 依依成人综合网| 成人黄色国产精品网站大全在线免费观看| 亚洲国产婷婷香蕉久久久久久99| 三妻四妾完整版在线观看电视剧| 日韩亚洲欧美一区二区三区| 激情高潮到大叫狂喷水| 老司机亚洲精品| 欧美日韩一区在线视频| 91破解版在线观看| 欧美大片日本大片免费观看| 久久福利免费视频| 男男成人高潮片免费网站| 欧美在线视频一区二区三区| 精精国产xxxx视频在线播放| 日韩美女天天操| 农村妇女精品一区二区| 久久成人羞羞网站| 亚洲一二三区在线| 成人国产精品一区二区免费麻豆| 亚洲午夜精品久久久久久性色| 丰满少妇xoxoxo视频| 91蜜桃网址入口| 国产91在线视频观看| 欧美成人专区| 91av视频在线| 免费在线黄色影片| 欧美性生交大片免网| 国产伦精品一区二区三区妓女 | 亚洲人成伊人成综合网小说| 色呦色呦色精品| 99热国内精品永久免费观看| 成人黄色免费在线观看| 老司机在线看片网av| 欧美卡1卡2卡| 欧美激情图片小说| 国产999精品久久久久久绿帽| 国产精品无码免费专区午夜| 精品国产一区二| 欧美激情在线有限公司| 少妇一级淫片免费看| 欧美性猛xxx| 国产探花视频在线播放| 老汉av免费一区二区三区| 免费久久久久久| 在线观看视频一区二区三区| 久久久久久欧美| 欧美美女搞黄| 欧美久久一区二区| 国产在线视频你懂的| 久久精品无码一区二区三区| 五月天视频在线观看| 亚洲午夜极品| 色噜噜狠狠色综合网| 国产成年精品| 97在线观看免费高清| 国产午夜在线视频| 日韩欧美专区在线| 日韩一区二区视频在线| 国产精品久久777777| 黄色免费视频网站| 蜜桃av噜噜一区| 成人性免费视频| 欧美日韩黑人| www.成人av.com| 久久天堂av| 久久久人成影片一区二区三区观看 | 欧美激情不卡| 97超碰国产精品女人人人爽| jizz在线免费观看| 亚洲国产又黄又爽女人高潮的| 中国a一片一级一片| 亚洲影院在线观看| 亚洲综合第一区| 99国产精品一区| 亚洲欧美一区二区三区不卡| 久久一二三四| 一本大道东京热无码aⅴ| 香蕉久久夜色精品国产使用方法 | 精品国产一区二区三区忘忧草| 国产精品suv一区二区三区| 久久精品日韩一区二区三区| 一级做a免费视频| 99re国产精品| 日韩精品在线观看av| 精品国产1区| 99久久精品无码一区二区毛片| 伊人久久综合一区二区| 欧美另类极品videosbestfree| 天堂中文在线视频| 欧美日韩国产影片| 在线观看黄网站| 亚洲午夜在线观看视频在线| 国产又粗又猛又爽又黄av| 国产黄人亚洲片| 密臀av一区二区三区| 国内精品久久久久久久影视蜜臀| 日韩精品一线二线三线| 免费福利视频一区| 国产视频观看一区| 日本一区二区电影| 91国产精品视频在线| a级毛片免费观看在线| 色狠狠av一区二区三区香蕉蜜桃| 天天干天天插天天操| 91精品国产综合久久小美女| 色av性av丰满av| 欧美性猛交xxxxx水多| 免费在线一级片| 亚洲色图丝袜美腿| 国产免费无遮挡吸奶头视频| 91麻豆免费观看| 成人欧美精品一区二区| 国产在线乱码一区二区三区| 午夜免费看毛片| 日韩精品色哟哟| 欧美 日本 亚洲| 亚洲午夜视频| 欧美精品自拍视频| 欧美日韩第一区| 欧美一级黄色录像片| 在线一区电影| 一级黄色录像免费看| 久久免费大视频| 日本一区二区三区在线视频| 少妇精品久久久一区二区三区 | 国产伦精品一区二区三区视频| 久久亚洲午夜电影| 欧美人妖在线观看| 国产区日韩欧美| h视频久久久| 九九九九精品九九九九| 极品一区美女高清| 国产精品一区二区三区观看| 特黄特色欧美大片| 欧美一区二区福利| 国际精品欧美精品| 亚洲精品成人三区| 日韩欧美高清| 在线日韩av永久免费观看| 国产一区二区三区不卡视频网站| 丝袜美腿玉足3d专区一区| 精品福利久久久| 亚洲精品二区| 国产一区二区中文| 男人天堂手机在线视频| 亚洲伦理一区| 黄色一级片播放| 蜜桃视频一区二区三区在线观看| 男人添女人下面免费视频| 美女诱惑一区二区| 亚洲图片欧美另类| 91欧美激情一区二区三区成人| 欧美 变态 另类 人妖| 99久久久精品| 懂色av粉嫩av蜜臀av一区二区三区| 国产精品久久久久国产精品日日| 韩国一级黄色录像| 午夜久久电影网| 懂色av蜜臀av粉嫩av分享吧最新章节| 欧美午夜不卡视频| av中文字幕播放| 亚洲电影在线看| 国产区视频在线| 少妇精69xxtheporn| hd国产人妖ts另类视频| 欧美在线欧美在线| 日韩大陆av| 91丨九色丨国产在线| 国产福利一区二区精品秒拍| 亚洲精品国产精品国自产| 五月天久久777| 欧美老熟妇喷水| 日本一区中文字幕| 国产美女视频免费观看下载软件| 久久久午夜电影| 国产探花在线免费观看| 色婷婷综合久久久久中文 | 久久av资源站| 日韩aaaaa| 亚洲激情图片qvod| 天堂网一区二区| 日韩欧美国产一区在线观看| av在线资源网| 97视频免费在线观看| 亚洲精品成人一区| 狠狠色噜噜狠狠色综合久 | 久久综合狠狠综合久久激情| 国产小视频你懂的| 欧美日韩亚洲精品一区二区三区| 精品人妻少妇AV无码专区| 亚洲美女av电影| 污污的视频在线观看| 国产精品久久久久久久9999| jizz国产精品| 日本三级中国三级99人妇网站| 小处雏高清一区二区三区| 日批视频在线免费看| 国产精品一卡二| 亚洲理论片在线观看| 午夜av一区二区三区| 国产女人高潮的av毛片| 亚洲奶大毛多的老太婆| 国产免费拔擦拔擦8x高清在线人 | 久久精品视频9| 色综合久久88色综合天天免费| 国产精品视频在线观看免费| 亚洲色图国产精品| 黄色综合网址| 国产精品一区二区欧美黑人喷潮水| 日韩精品一卡| 久久久久久久久久久久久久久国产| 综合图区亚洲| 国产精品色婷婷视频| 一本色道久久综合狠狠躁的番外| 影音先锋欧美资源| 久草热8精品视频在线观看| 无码 人妻 在线 视频| 午夜不卡在线视频| 秋霞av在线| 91精品国产91久久久| 精品亚洲a∨一区二区三区18| 在线视频91| 久久超级碰视频| 亚洲人成人无码网www国产| 在线观看日韩电影| 欧美精品久久久久久久久久丰满| 久久久亚洲天堂| 欧美18xxxx| 日本午夜激情视频| wwww国产精品欧美| 国产成人无码av| 亚洲午夜激情免费视频| 亚洲伦理网站| 在线观看一区二区三区三州| 久久电影网电视剧免费观看| 国产精品久久久久久久精| 欧美一区二区三区视频免费播放| 免费高清完整在线观看| 不卡视频一区| 在线精品一区| 亚洲图片综合网| 在线观看一区日韩| a视频网址在线观看| 国产激情久久久久| 亚洲第一偷拍| 黑人无套内谢中国美女| 黄色精品在线看| 国产资源在线看| 91精品久久久久久综合乱菊| 国内视频精品| av无码av天天av天天爽| 91福利视频在线| 肉肉视频在线观看| 精品一区二区不卡| 日韩精品每日更新| 夫妻性生活毛片| 日韩免费看网站| av成人在线看| 黄色免费高清视频| 99国内精品久久| 国产裸体永久免费无遮挡| 欧美激情中文字幕乱码免费| 成人羞羞网站入口| 一区二区三区国产好的精华液| 亚洲一本大道在线| 在线视频1区2区| 成人欧美一区二区三区视频xxx| 久久中文精品| 性欧美疯狂猛交69hd| 亚洲欧美日韩成人| 最新亚洲国产| 777久久久精品一区二区三区 |