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

Napi入門(一)—如何創(chuàng)建一個(gè)NAPI 工程

系統(tǒng) OpenHarmony
OpenHarmony 提供了 NAPI 框架用于實(shí)現(xiàn) JS 和 C/C++ 互相調(diào)用的能力,DevEco Studio 默認(rèn)支持創(chuàng)建 NAPI 應(yīng)用,我們今天就來創(chuàng)建一個(gè)NAPI 工程。

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

NAPI是什么?

NAPI(Native API)組件是一套對(duì)外接口基于Node.js N-API規(guī)范開發(fā)的原生模塊擴(kuò)展開發(fā)框架。

在移動(dòng)應(yīng)用開發(fā)中需要使用 C/C++ 實(shí)現(xiàn)的場(chǎng)景有很多,比如音視頻處理,圖像處理等較高性能要求的場(chǎng)景。

OpenHarmony 提供了 NAPI 框架用于實(shí)現(xiàn) JS 和 C/C++ 互相調(diào)用的能力,DevEco Studio 默認(rèn)支持創(chuàng)建 NAPI 應(yīng)用,我們今天就來創(chuàng)建一個(gè)NAPI 工程。

創(chuàng)建NAPI 工程

打開IDE,選擇創(chuàng)建項(xiàng)目,選擇下面的Native C++模板。

#創(chuàng)作者激勵(lì)#【堅(jiān)果派-堅(jiān)果】Napi入門【一】-開源基礎(chǔ)軟件社區(qū)

點(diǎn)擊 Next 按鈕后,項(xiàng)目名稱選擇NapiHello,點(diǎn)擊finish即可。

#創(chuàng)作者激勵(lì)#【堅(jiān)果派-堅(jiān)果】Napi入門【一】-開源基礎(chǔ)軟件社區(qū)

等待項(xiàng)目加載完成,如果大家觀察細(xì)致的話,會(huì)發(fā)現(xiàn),這里面有個(gè)不同之處就是多了CPP目錄。

#創(chuàng)作者激勵(lì)#【堅(jiān)果派-堅(jiān)果】Napi入門【一】-開源基礎(chǔ)軟件社區(qū)

我么可以點(diǎn)開來看一下。

#創(chuàng)作者激勵(lì)#【堅(jiān)果派-堅(jiān)果】Napi入門【一】-開源基礎(chǔ)軟件社區(qū)

該目錄用來存放 cpp 的源碼及相關(guān)配置文件,各文件說明如下:

  • hello.cppindex.d.ts 文件中聲明的方法的 C++ 實(shí)現(xiàn)源碼。
  • CMakeLists.txt:是cmake用來生成Makefile文件需要的一個(gè)描述編譯鏈接的腳本文件。
  • index.d.ts:對(duì) ts 提供的方法聲明。
  • package.json:打包的配置文件。

另外 CMakeLists.txt 文件還會(huì)在 build-profile.json5 里做配置,代碼如下所示:

{
"apiType": 'stageMode',
"buildOption": {
"externalNativeOptions": {
"path": "./src/main/cpp/CMakeLists.txt",
"arguments": "",
"cppFlags": "",
}
},
"targets": [
{
"name": "default"
},
{
"name": "ohosTest",
}
]
}

點(diǎn)擊自動(dòng)化簽名,然后運(yùn)行項(xiàng)目就可以。

#創(chuàng)作者激勵(lì)#【堅(jiān)果派-堅(jiān)果】Napi入門【一】-開源基礎(chǔ)軟件社區(qū)

這個(gè)時(shí)候我們就可以來看一下代碼內(nèi)容,分析一下了。

我們?cè)賮砜匆幌耰ndex.ets的內(nèi)容。

import hilog from '@ohos.hilog';
import testNapi from 'libentry.so'

@Entry
@Component
struct Index {
@State message: string = 'Hello World'

build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
this.message = "值為"+testNapi.add(2, 3)
hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));


})
}
.width('100%')
}
.height('100%')
}
}

運(yùn)行之后,我們就可以看到。

NAPI項(xiàng)目簡(jiǎn)述

index.d.ts解讀

在 cpp 的 libentry 目錄下生成了 index.d.ts 文件,它的源碼如下所示:

export const add: (a: number, b: number) => number;

export const 表示導(dǎo)出一個(gè)常量以便在其它文件中使用。add 是一個(gè)返回類型為 ??number??? 的方法,它的參數(shù)類為 ??number?? 類型。

package.json解讀

在 cpp 的 libentry 目錄下生成了 package.json 文件,該文件是打包的配置文件,內(nèi)容如下所示:

{
"name": "libentry.so",
"types": "./index.d.ts"
}

設(shè)置 libentry.so 庫和 index.d.ts 相關(guān)聯(lián),便于在 TS 文件中引入 libentry.so 時(shí)調(diào)用庫中的相關(guān)方法。

CMakeLists.txt解讀

CMake 是一個(gè)開源跨平臺(tái)的構(gòu)建工具,旨在構(gòu)建、測(cè)試和打包軟件,CMake 是 makefile 的上層工具,用于跨平臺(tái)構(gòu)建環(huán)境,生成可移植的 makefile 并簡(jiǎn)化自動(dòng)動(dòng)手寫 makefile 的工作量,在 cpp 目錄下默認(rèn)生成的 CMakeLists.txt 內(nèi)容如下所示:

# the minimum version of CMake.
# 聲明使用 CMAKE 的最小版本號(hào)
cmake_minimum_required(VERSION 3.4.1)

# 聲明項(xiàng)目的名稱
project(oh_0400_napi)

# set命令,格式為set(key value),表示設(shè)置key的值為value,其中value可以是路徑,也可以是許多文件。
# 本例中設(shè)置NATIVERENDER_ROOT_PATH的值為${CMAKE_CURRENT_SOURCE_DIR}
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

# 添加項(xiàng)目編譯所需要的頭文件的目錄
include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include)

# 生成目標(biāo)庫文件libentry.so,entry表示最終的庫名稱,SHARED表示生成的是動(dòng)態(tài)鏈接庫,
# hello.cpp表示最終生成的libentry.so中所包含的源碼
# 如果要生成靜態(tài)鏈接庫,把SHARED該成STATIC即可
add_library(entry SHARED hello.cpp)

# 把libentry.so鏈接到libace_napi.z.so上
target_link_libraries(entry PUBLIC libace_napi.z.so)

hello.cpp解讀

在 cpp 目錄下默認(rèn)生成的 hello.cpp 文件,源碼如下所示:

#include "napi/native_api.h"
#include <js_native_api.h>
#include <js_native_api_types.h>

static napi_value Add(napi_env env, napi_callback_info info)
{
size_t requireArgc = 2;
size_t argc = 2;
napi_value args[2] = {nullptr};

napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);

napi_valuetype valuetype0;
napi_typeof(env, args[0], &valuetype0);

napi_valuetype valuetype1;
napi_typeof(env, args[1], &valuetype1);

double value0;
napi_get_value_double(env, args[0], &value0);

double value1;
napi_get_value_double(env, args[1], &value1);

napi_value sum;
napi_create_double(env, value0 + value1, &sum);
return sum;
}
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
napi_property_descriptor desc[] = {
{ "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr },
};

napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END

static napi_module demoModule = {
.nm_version =1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = "entry",
.nm_priv = ((void*)0),
.reserved = { 0 },
};

extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
{
napi_module_register(&demoModule);
}

hello.cpp 的代碼不是很復(fù)雜,我們可以做如下拆分:

  • 引入頭文件
#include "napi/native_api.h"
#include <js_native_api.h>
#include <js_native_api_types.h>

引入頭文件,作用和 TS 里的 import 類似,不再詳述。

  • 注冊(cè)napi模塊
static napi_module demoModule = {
.nm_version =1,//nm_version:nm版本號(hào),默認(rèn)值為 1。
.nm_flags = 0,//nm標(biāo)記符,默認(rèn)值為 0。
.nm_filename = nullptr,//暫不關(guān)注,使用默認(rèn)值即可。
.nm_register_func = Init,//指定nm的入口函數(shù)。
.nm_modname = "entry",//指定 TS 頁面導(dǎo)入的模塊名,例如:`import testNapi from 'libentry.so'` 中的 testNapi
//就是當(dāng)前的nm_modname。
.nm_priv = ((void*)0),//暫不關(guān)注,使用默認(rèn)值即可。
.reserved = { 0 },//暫不關(guān)注,使用默認(rèn)值即可。
};

extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
{
napi_module_register(&demoModule);
}

定義 NAPI 模塊,類型為 napi_module 結(jié)構(gòu)體,各字段說明如下:

  • nm_version:nm版本號(hào),默認(rèn)值為 1。
  • nm_flags:nm標(biāo)記符,默認(rèn)值為 0。
  • nm_filename:暫不關(guān)注,使用默認(rèn)值即可。
  • nm_register_func:指定nm的入口函數(shù)。
  • nm_modname:指定 TS 頁面導(dǎo)入的模塊名,例如:import testNapi from 'libentry.so' 中的 testNapi 就是當(dāng)前的nm_modname。
  • nm_priv:暫不關(guān)注,使用默認(rèn)值即可。
  • reserved:暫不關(guān)注,使用默認(rèn)值即可。

extern "C" 簡(jiǎn)單理解就是告訴編譯器這部分代碼按照 C 語言進(jìn)行編譯而不是 C++ 語言編譯。__attribute__((constructor)) 聲明方法的執(zhí)行時(shí)機(jī),它表示 RegisterEntryModule() 方法在 main() 方法執(zhí)行前執(zhí)行, RegisterEntryModule() 方法內(nèi)調(diào)用了 napi_module_register() 方法,該方法是 NAPI 提供的模塊注冊(cè)方法,表示把定義的 demoModule 模塊注冊(cè)到系統(tǒng)中。

  • 方法定義
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
napi_property_descriptor desc[] = {
{ "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr },
};

napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END

Init() 方法內(nèi)聲明了 napi_property_descriptor 結(jié)構(gòu)體,結(jié)構(gòu)體的定義看第一個(gè)和第三個(gè)參數(shù)即可,第一個(gè)參數(shù) add 表示應(yīng)用層 JS 聲明的方法,Add 表示 Native C++ 實(shí)現(xiàn)的方法,然后調(diào)用 NAPI 的 napi_define_properties() 方法將 add 和 Add 做個(gè)映射,最后通過 exports 變量對(duì)外導(dǎo)出,實(shí)現(xiàn) JS 端調(diào)用 add 方法時(shí)進(jìn)而調(diào)用到 C++ 的 Add() 方法。

  • 方法實(shí)現(xiàn)
static napi_value Add(napi_env env, napi_callback_info info)
{
// 獲取 2 個(gè)參數(shù),napi_value是對(duì) JS 類型的封裝
size_t requireArgc = 2;
size_t argc = 2;
napi_value args[2] = {nullptr};
// 調(diào)用napi_get_cb_info方法,從 info 中讀取傳遞進(jìn)來的參數(shù)放入args里
napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);

// 獲取參數(shù)并校驗(yàn)類型
napi_valuetype valuetype0;
napi_typeof(env, args[0], &valuetype0);
napi_valuetype valuetype1;
napi_typeof(env, args[1], &valuetype1);

// 調(diào)用napi_get_value_double把 napi_value 類型轉(zhuǎn)換成 C++ 的 double 類型
double value0;
napi_get_value_double(env, args[0], &value0);
double value1;
napi_get_value_double(env, args[1], &value1);

// 調(diào)用napi_create_double方法把 C++類型轉(zhuǎn)換成 napi_value 類型
napi_value sum;
napi_create_double(env, value0 + value1, &sum);

// 返回 napi_value 類型
return sum;

}

Add() 方法注釋的很清楚,首先從 napi_callback_info 中讀取 napi_value 類型的參數(shù)放入到 args 中,然后從 args 中讀取參數(shù)并把 napi_value 類型轉(zhuǎn)換成 C++ 類型后進(jìn)行加操作,最后把相加的結(jié)果轉(zhuǎn)換成 napi_value 類型并返回。

  • 模塊導(dǎo)入
import testNapi from 'libentry.so'

根據(jù)前邊的編譯配置,cpp 目錄下的源碼最終打包成了 libentry.so,使用前直接引入即可。

  • 方法調(diào)用
import hilog from '@ohos.hilog';
import testNapi from 'libentry.so'

@Entry
@Component
struct Index {
@State message: string = 'Hello World'

build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
this.message = "值為"+testNapi.add(2, 3)
hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3));


})
}
.width('100%')
}
.height('100%')
}
}

引入 libentry.so 模塊后,就可以直接調(diào)用 ??add()?? 方法了。

NAPI數(shù)據(jù)類型

napi_value數(shù)據(jù)類型

OpenHarmony NAPI 將 ECMAScript 標(biāo)準(zhǔn)中定義的 Boolean、Null、Undefined、Number、BigInt、String、Symbol和 Object 這八種數(shù)據(jù)類型以及函數(shù)對(duì)應(yīng)的 Function 類型統(tǒng)一封裝成了 napi_value 類型,它是 JS 數(shù)據(jù)類型和 C/C++ 數(shù)據(jù)類型之間的橋梁,??napi_value (opens new window)??官網(wǎng)說明如下:

napi_value 表示 JS 值的不透明指針,在 C/C++ 端要使用 JS 端傳遞的數(shù)據(jù)類型,都是通過 NAPI 提供的相關(guān)方法把napi_value轉(zhuǎn)換成 C/C++ 類型后再使用,同理當(dāng)需要把 C/C的數(shù)據(jù)傳遞給 JS 應(yīng)用層也要通過 NAPI 提供的方法把 C/C 端的數(shù)據(jù)轉(zhuǎn)換成 napi_value 再向上傳遞。

#創(chuàng)作者激勵(lì)#【堅(jiān)果派-堅(jiān)果】Napi入門【一】-開源基礎(chǔ)軟件社區(qū)

C/C++轉(zhuǎn)napi_value

NAPI提供了 napi_create_ 開頭的方法表示把 C/C++ 類型轉(zhuǎn)換成 napi_value 類型,常見方法如下所示:

int類型轉(zhuǎn)換

NAPI_EXTERN napi_status napi_create_int32(napi_env env,
int32_t value,
napi_value* result);
NAPI_EXTERN napi_status napi_create_uint32(napi_env env,
uint32_t value,
napi_value* result);
NAPI_EXTERN napi_status napi_create_int64(napi_env env,
int64_t value,
napi_value* result);

把 C/C++ 的 int32_t、uint32_t 以及 int64_t 類型轉(zhuǎn)換成 napi_value 類型,參數(shù)說明如下:

  • env:方法調(diào)用者的運(yùn)行環(huán)境,包含 JS 引擎等。
  • value:C/C++端的 int 類型的值。
  • result:napi_value,返回給 JS 應(yīng)用層的數(shù)據(jù)。

double類型轉(zhuǎn)換

NAPI_EXTERN napi_status napi_create_double(napi_env env,
double value,
napi_value* result);

把 C/C++ 端的 double 類型轉(zhuǎn)換成 napi_value 類型,參數(shù)說明如下:

  • env:方法調(diào)用者的運(yùn)行環(huán)境,包含 JS 引擎等。
  • value:C/C++ 端的 double 類型的值。
  • result:napi_value,返回給 JS 應(yīng)用層的數(shù)據(jù)。

string類型轉(zhuǎn)換

NAPI_EXTERN napi_status napi_create_string_latin1(napi_env env,
const char* str,
size_t length,
napi_value* result);
NAPI_EXTERN napi_status napi_create_string_utf8(napi_env env,
const char* str,
size_t length,
napi_value* result);
NAPI_EXTERN napi_status napi_create_string_utf16(napi_env env,
const char16_t* str,
size_t length,
napi_value* result);

把 C/C++ 端的 char 類型轉(zhuǎn)換成 napi_value 類型,參數(shù)說明如下:

  • env:方法調(diào)用者的運(yùn)行環(huán)境,包含 JS 引擎等。
  • str:C/C++端的字符串類型的值。
  • size_t:str 的長(zhǎng)度。
  • result:napi_value,返回給 JS 應(yīng)用層的數(shù)據(jù)。

napi_value轉(zhuǎn)C/C++

NAPI提供了 napi_get_value_ 開頭的方法表示把 napi_value 轉(zhuǎn)換成 C/C++ 類型,常見方法如下所示:

int類型轉(zhuǎn)換

NAPI_EXTERN napi_status napi_get_value_int32(napi_env env,
napi_value value,
int32_t* result);
NAPI_EXTERN napi_status napi_get_value_uint32(napi_env env,
napi_value value,
uint32_t* result);
NAPI_EXTERN napi_status napi_get_value_int64(napi_env env,
napi_value value,
int64_t* result);

把 JS 端的 number 類型轉(zhuǎn)換成 C/C++ 的對(duì)應(yīng)數(shù)據(jù)類型,參數(shù)說明如下:

  • env:方法調(diào)用者的運(yùn)行環(huán)境,包含 JS 引擎等。
  • value:JS 端傳遞進(jìn)來的數(shù)據(jù)。
  • result:接收 value 的值。

double類型轉(zhuǎn)換

NAPI_EXTERN napi_status napi_get_value_double(napi_env env,
napi_value value,
double* result);

把 JS 端的 number 類型轉(zhuǎn)換成 C/C++ 的 double 類型,參數(shù)說明如下:

  • env:方法調(diào)用者的運(yùn)行環(huán)境,包含 JS 引擎等。
  • value:JS 端傳遞進(jìn)來的數(shù)據(jù)。
  • result:接收 value 的值。

string類型轉(zhuǎn)換

NAPI_EXTERN napi_status napi_get_value_string_latin1(napi_env env,
napi_value value,
char* buf,
size_t bufsize,
size_t* result);

// Copies UTF-8 encoded bytes from a string into a buffer.
NAPI_EXTERN napi_status napi_get_value_string_utf8(napi_env env,
napi_value value,
char* buf,
size_t bufsize,
size_t* result);

// Copies UTF-16 encoded bytes from a string into a buffer.
NAPI_EXTERN napi_status napi_get_value_string_utf16(napi_env env,
napi_value value,
char16_t* buf,
size_t bufsize,
size_t* result);

把 JS 端的 string 類型轉(zhuǎn)換成 C/C++ 的 char 類型,參數(shù)說明如下:

  • env:方法調(diào)用者的運(yùn)行環(huán)境,包含 JS 引擎等。
  • value:napi_value,JS 端傳遞進(jìn)來的數(shù)據(jù)。
  • buf:char數(shù)組,用來存放napi_value中的 string 值
  • bufsize:char數(shù)組長(zhǎng)度
  • result:接收 value 的值。

boolean類型轉(zhuǎn)換

NAPI_EXTERN napi_status napi_get_value_bool(napi_env env,
napi_value value,
bool* result);

把 JS 端的 boolean 類型轉(zhuǎn)換成 C/C++ 的 bool 類型,參數(shù)說明如下:

  • env:方法調(diào)用者的運(yùn)行環(huán)境,包含 JS 引擎等。
  • value:JS 端傳遞進(jìn)來的數(shù)據(jù)。
  • result:接收 value 的值。

參考

Node-API:

https://docs.openharmony.cn/pages/v3.2Beta/zh-cn/application-dev/reference/native-lib/third_party_napi/napi.md/。

原生模塊擴(kuò)展開發(fā)框架:

https://gitee.com/openharmony/arkui_napi。

Node_API :用于封裝JavaScript能力為native插件的API,獨(dú)立于底層JavaScript,并作為Node.js的一部分。

??Native API中支持的標(biāo)準(zhǔn)庫?? :目前支持標(biāo)準(zhǔn)C庫、C++庫、OpenSL ES、zlib。

C常用函數(shù)庫 :math.h。

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/sin。

Cmake :管理源代碼構(gòu)建的工具。

??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

??https://ost.51cto.com??

責(zé)任編輯:jianghua 來源: 51CTO 開源基礎(chǔ)軟件社區(qū)
相關(guān)推薦

2023-03-10 09:41:16

NAPI框架鴻蒙

2022-10-25 15:05:17

NAPI開發(fā)鴻蒙

2023-03-14 21:29:26

MysubsysNAPI框架

2022-10-11 15:04:28

NAPI開發(fā)鴻蒙

2022-10-09 15:05:50

NAPI框架鴻蒙

2023-04-26 15:29:35

NAPI模塊鴻蒙

2018-03-23 10:00:34

PythonTensorFlow神經(jīng)網(wǎng)絡(luò)

2023-06-12 08:00:48

Napi-rsRust 前端工具

2015-03-24 19:48:24

2013-05-02 10:40:24

xcode

2010-08-05 15:46:13

Flex行為Flex效果

2024-01-03 15:41:49

2021-09-16 15:08:08

鴻蒙HarmonyOS應(yīng)用

2021-05-06 10:33:30

C++Napiv8

2020-06-02 10:04:58

IT部門首席信息官CIO

2017-02-10 20:00:17

Linux共享目錄命令

2021-12-08 15:07:51

鴻蒙HarmonyOS應(yīng)用

2016-03-08 09:52:22

xcode插件開發(fā)

2022-07-19 20:04:31

NAPI模塊鴻蒙

2015-08-17 10:32:06

前端工程師優(yōu)秀
點(diǎn)贊
收藏

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

99热国产免费| 日韩亚洲综合在线| 久久久一本二本三本| 国产一二在线观看| 麻豆精品一区二区av白丝在线| 日韩在线视频一区| 深田咏美中文字幕| 成人在线黄色| 一区二区日韩av| 免费国产一区| 精品毛片一区二区三区| 久久久777| 欧美日韩福利视频| 在哪里可以看毛片| 亚洲一区二区三区日本久久九| 欧美日韩国产精品专区| 中国一级黄色录像| 久久精品蜜桃| gogo大胆日本视频一区| 成人黄色av网站| 丁香社区五月天| 亚洲天堂成人| 久久久国产一区二区| 亚洲精品成人无码| 另类春色校园亚洲| 日韩一区二区三| 欧美婷婷精品激情| 亚洲精品福利电影| 亚洲色图在线播放| 亚洲图片在线观看| 久色视频在线| 久久无码av三级| 91人成网站www| 中文字幕乱码一区二区| 亚洲影院免费| 97国产一区二区精品久久呦| 欧美偷拍第一页| 色97色成人| 国产偷亚洲偷欧美偷精品| 青娱乐精品在线| 另类一区二区三区| 欧美性xxxxxx少妇| 精品久久久久久久免费人妻| 高清电影在线观看免费| 亚洲精品国产精华液| 一本一道久久a久久综合精品| 伦理片一区二区三区| 91色在线porny| 精品欧美日韩在线| 天天干天天做天天操| 不卡的av网站| 国产伦精品一区二区三区免费视频| a天堂视频在线| 国产精品一区二区91| 91在线网站视频| 国产av无码专区亚洲av| 国产精品99久久久久久有的能看| 91久久国产精品| 99精品国产99久久久久久97| 国产精品一区在线观看乱码 | 激情六月天婷婷| 人交獸av完整版在线观看| 一区二区三区日本| 欧妇女乱妇女乱视频| 福利成人导航| 欧美日韩亚洲系列| 日本va中文字幕| 国产乱子精品一区二区在线观看| 欧美日韩国产不卡| 久久综合桃花网| 另类尿喷潮videofree| 亚洲欧美日韩视频一区| 五月婷婷六月香| 亚洲国产不卡| 97国产suv精品一区二区62| 91精品国产综合久久久蜜臀九色 | 国产精品国产亚洲伊人久久| 激情开心成人网| 久久久久久9999| 色噜噜狠狠一区二区三区| 理论视频在线| 日韩一区有码在线| 黄色一级片国产| 免费一二一二在线视频| 在线一区二区三区四区五区| 亚洲va在线va天堂va偷拍| 日韩中文字幕一区二区高清99| 亚洲成人网在线| 欧美18—19性高清hd4k| 欧美在线观看天堂一区二区三区| 亚洲人成电影网站色xx| 91久久久久久久久久久久久久| 欧美在线免费| 日韩av观看网址| 国产伦精品一区二区三区照片91| 成人久久久精品国产乱码一区二区| 国产aa精品| 欧美一区二区视频在线观看| 一级黄色片毛片| 精品国产欧美日韩| 欧美日韩电影在线观看| 国产一级淫片a视频免费观看| 日韩国产在线一| 国产成人高清激情视频在线观看 | 日韩电影一区二区三区四区| 国产精品国产福利国产秒拍 | 亚洲精品午夜精品| 午夜精品福利在线视频| 欧美精品国产| 国产精品免费久久久| 亚洲国产精品久久久久久久| 国产欧美日韩激情| 91精品国产91久久久久麻豆 主演| 一级毛片久久久| 欧美人狂配大交3d怪物一区| 大地资源二中文在线影视观看 | 91 中文字幕| eeuss鲁片一区二区三区在线观看 eeuss影院一区二区三区 | 日韩乱码一区二区三区| 不卡的看片网站| 永久免费看av| 欧洲成人一区| 亚洲精品一区二区久| 免费无码毛片一区二区app| 蜜桃精品视频在线| 欧美激情国产日韩| 日本电影在线观看| 欧美一区二区三区免费大片| 极品人妻videosss人妻| 亚洲一区二区伦理| 国产精华一区| 欧美巨大xxxx做受沙滩| 91精品国产综合久久小美女| 国产欧美小视频| 日本不卡一区二区| 久久av一区二区三区亚洲| 久色国产在线| 日韩精品最新网址| 欧美黄色免费看| 国产精品1区2区| www国产免费| 视频二区欧美| 久久成年人视频| 国产三级午夜理伦三级| 中文字幕精品三区| 国产xxxxx视频| 久久天堂久久| 久久中文字幕国产| 亚洲中文字幕在线观看| 国产精品久久久久一区二区三区| 可以免费观看av毛片| 国产99亚洲| 国产成人精品一区二区| 自拍视频在线免费观看| 欧美日精品一区视频| 亚洲女同二女同志奶水| 激情久久五月天| 欧美另类交人妖| 亚洲成a人片77777精品| 午夜久久久久久久久| 国产中文字幕一区二区| 久久精品盗摄| 水蜜桃一区二区三区| 91丨精品丨国产| 久久99视频免费| 色窝窝无码一区二区三区| 欧美午夜女人视频在线| 真实乱视频国产免费观看| 久久超碰97人人做人人爱| 在线观看三级网站| 美国十次av导航亚洲入口| 精品久久久久久久久久久| 国产精品一区二| heyzo一区| 亚洲欧美精品一区二区| 欧美激情一区二区三区免费观看 | 欧美视频第一| 欧美成人激情视频| 天天干天天色天天| 欧美日韩在线不卡| 久久久久无码国产精品| 97se狠狠狠综合亚洲狠狠| 最新中文字幕2018| 国内在线观看一区二区三区| 欧美日韩精品综合| 国产精久久一区二区| 91精品国产成人www| a天堂中文在线| 欧美v国产在线一区二区三区| 国产精品黄色大片| 中文字幕在线观看一区| 黄色av电影网站| 免费久久99精品国产| av日韩在线看| 欧美日韩伦理在线免费| 高清视频一区二区三区| 高清av一区二区三区| 久久久久国产视频| 97视频在线观看网站| 精品国内二区三区| 一级爱爱免费视频| 欧美丝袜第一区| 欧美一区二区三区爽爽爽| 久久综合网色—综合色88| 欧美体内she精高潮| 久久久久中文| 99在线免费视频观看| 日韩在线第七页| 久久精品人人做人人爽电影| 久久国产精品美女| 国产精品日韩欧美综合| 国产中文在线播放| 不卡av日日日| jizz在线免费观看| 日韩精品www| 性色av蜜臀av| 制服丝袜中文字幕亚洲| 自拍偷拍18p| 精品久久久久久久久久国产| 免费日韩在线视频| 日韩理论片一区二区| 精品国产aaa| 久久五月婷婷丁香社区| 999精品免费视频| 国产成人午夜精品影院观看视频| 9久久婷婷国产综合精品性色 | 2024亚洲男人天堂| 亚洲妇熟xxxx妇色黄| 日韩亚洲一区二区| 国产黄色片在线观看| 亚洲精品国产拍免费91在线| 亚洲AV无码一区二区三区少妇| 欧美久久久久久久久中文字幕| aaaaaa毛片| 欧美视频一二三| 日韩 欧美 中文| 午夜久久久影院| 精品无码一区二区三区电影桃花| 亚洲欧美区自拍先锋| 三级影片在线观看| 中文字幕av资源一区| 欧美老女人性生活视频| 国产婷婷色一区二区三区四区| 三级男人添奶爽爽爽视频 | 91精品国产全国免费观看| 综合久久中文字幕| 欧美三级电影网| 91精东传媒理伦片在线观看| 欧美日韩在线播放一区| 中文字幕精品一区二区精| 欧美日韩亚洲综合在线| 依依成人在线视频| 欧美精品 国产精品| 国产又大又黑又粗| 日韩视频一区在线观看| 精品人妻少妇AV无码专区| 日韩精品一区二区在线| 欧美视频在线观看一区二区三区| 精品国产一区二区三区四区四| 亚洲国产综合网| 日韩国产精品一区| 欧美美乳在线| 中文字幕视频一区二区在线有码| 91高清在线视频| 久久人体大胆视频| 手机在线免费观看av| 久久久久久久久久久网站| 国产一二在线播放| 国产精品盗摄久久久| 99久久999| 国产精品10p综合二区| 日本亚洲不卡| 日韩三级电影网站| 午夜影院欧美| 免费看毛片的网址| 亚洲一区免费| 国产精品视频中文字幕| 国产凹凸在线观看一区二区| 中文字幕在线播放一区| 久久久久久久久一| 影音先锋男人资源在线观看| 亚洲综合丁香婷婷六月香| 四虎成人永久免费视频| 欧美日韩卡一卡二| 乱精品一区字幕二区| 亚洲人午夜色婷婷| 91香蕉在线观看| 欧美在线国产精品| 四虎永久精品在线| 国产精品一区二区三区不卡| 狠狠综合久久av一区二区蜜桃| 麻豆md0077饥渴少妇| 免费欧美日韩| 精产国品一区二区三区| 久久久久久久久久久久久女国产乱 | 中文字幕一区二区三区四区视频| 91麻豆精品国产91久久久| 日本免费不卡视频| 三级精品视频久久久久| 国模私拍一区二区国模曼安| 国产欧美一区二区| 国产香蕉精品| 中文字幕中文字幕在线中一区高清| 亚洲第一精品影视| 狠狠操狠狠干视频| 久久影院视频免费| 国产这里有精品| 欧美在线观看一区| 污视频软件在线观看| 久久精品亚洲一区| 婷婷激情一区| 精品国产二区在线| 亚洲精品99| 奇米影音第四色| 91亚洲精品久久久蜜桃网站| 日韩成人毛片视频| 欧美日韩亚洲综合在线| 九色网友自拍视频手机在线| 欧美激情网友自拍| 国产精品久一| 涩涩日韩在线| 欧美亚洲专区| 日本一级片在线播放| 亚洲综合一区二区三区| 一级特黄aaa大片在线观看| 亚洲欧美一区二区三区在线| 18video性欧美19sex高清| 91久久精品一区二区别| 爽成人777777婷婷| 中文字幕第80页| 国产亚洲一本大道中文在线| 日韩成人免费观看| 亚洲成色999久久网站| 污视频在线免费观看网站| 91啪国产在线| 久久精品亚洲人成影院| 岛国av免费在线| 国产精品无人区| 久草热在线观看| 在线观看欧美成人| 日韩一区二区三区免费| 欧美一区二区三区四区夜夜大片 | 国产在线高清| 日本成人在线视频网址| 一本色道久久综合狠狠躁的番外| 九色自拍视频在线观看| 不卡的av电影在线观看| 国产大片中文字幕| 亚洲第一福利网站| 国内激情视频在线观看| 久久国产精品久久| 久热精品在线| 国产精品天天干| 精品视频色一区| 麻豆免费在线观看| 亚洲一区二区三区乱码aⅴ| 欧美在线观看天堂一区二区三区| 极品人妻一区二区| 亚洲成av人片一区二区梦乃| 日本高清视频免费看| 欧美亚洲另类视频| 国产一区二区三区探花| 色综合色综合色综合色综合| 亚洲欧美在线观看| 国产黄色高清视频| 久久久伊人日本| 窝窝社区一区二区| 黄色三级视频片| ...xxx性欧美| 国产91免费在线观看| 欧美一级高清免费播放| 欧美在线免费看视频| 99久久99精品| 亚洲国产美女搞黄色| 牛牛热在线视频| 国产日本欧美一区| 欧美日韩福利| 亚洲av无码一区二区三区人| 欧美日韩视频专区在线播放| 在线不卡日本v二区707| 欧美18视频| 精品制服美女丁香| 日韩福利片在线观看| 亚洲最大在线视频| 亚洲色图图片| 国产综合av在线| 亚洲视频一区二区在线观看| 日本黄色三级视频| 国产精品久久久久免费a∨| 女人香蕉久久**毛片精品| 欧美一区二区三区成人精品| 欧美日韩精品免费| 麻豆视频在线看| 永久久久久久| 久久影院午夜片一区| 国产美女自慰在线观看| 欧美怡春院一区二区三区| 在线看片不卡| 波多野结衣av在线观看| 精品国免费一区二区三区|