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

NAPI 類對(duì)象導(dǎo)出及其生命周期管理(下)

系統(tǒng) OpenHarmony
NDK (原生開(kāi)發(fā)套件) 是一套工具,使開(kāi)發(fā)者能夠在 OpenHarmony hap應(yīng)用中使用 C/C++ 代碼。

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

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

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

一、樣例工程源碼剖析

  • 工程的模板是Native C++,模型是Stage。
  • 源碼剖析主要圍繞以下幾個(gè)文件。

1、NAPI導(dǎo)出對(duì)象和生命周期管理具體實(shí)現(xiàn)

(1)定義NapiTest類及方法

  • Napi.h文件內(nèi)容如下:

#ifndef __NAPI_TEST_H__
#define __NAPI_TEST_H__

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

#include <iostream>

#define NAPI_CLASS_NAME "NapiTestClass"

class NapiTest {
public:
NapiTest() : mEnv(nullptr), mRef(nullptr) {
}

NapiTest(napi_env env) : mEnv(env), mRef(nullptr){
}
~NapiTest();

// 創(chuàng)建NapiTest類的實(shí)體,并將實(shí)體返回到應(yīng)用端,該方法為js創(chuàng)建一個(gè)類實(shí)體,因此需要將該接口對(duì)外導(dǎo)出
static napi_value Create(napi_env env, napi_callback_info info);

// 初始化js類并設(shè)置對(duì)應(yīng)屬性并將其導(dǎo)出
static napi_value Init(napi_env env, napi_value exports);
private:

// 設(shè)置數(shù)據(jù),此方法給到j(luò)s直接調(diào)用,因此需要將該接口對(duì)外導(dǎo)出
static napi_value SetMsg(napi_env env, napi_callback_info info);

// 獲取數(shù)據(jù),此方法給到j(luò)s直接調(diào)用,因此需要將該接口對(duì)外導(dǎo)出
static napi_value GetMsg(napi_env env, napi_callback_info info);

// 定義js結(jié)構(gòu)體時(shí)實(shí)際的構(gòu)建函數(shù)
static napi_value Constructor(napi_env env, napi_callback_info info);

// 釋放資源的函數(shù)(類似類的析構(gòu)函數(shù))
static void Destructor(napi_env env, void *nativeObject, void *finalize);

// 生命周期變量
static napi_ref sConstructor_;

// 設(shè)置和獲取數(shù)據(jù)的變量
static std::string _msg;

// 記錄環(huán)境變量
napi_env mEnv = nullptr;

// 記錄生命周期變量
napi_ref mRef = nullptr;

};

#endif /* __NAPI_TEST_H__ */

napi_value

  • Node.js Node-API的值用napi_value類型表示。
    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類型,用于接收ArkUI應(yīng)用傳遞過(guò)來(lái)的數(shù)據(jù)及返回?cái)?shù)據(jù)給ArkUI應(yīng)用。
  • 這是一個(gè)不透明的指針,用于表示JavaScript值。

napi_ref

  • 這是用來(lái)引用napi_value的抽象。這允許用戶管理JavaScript值的生命周期,包括顯式地定義它們的最小生命周期。
    https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_ref

napi_env

  • napi_env用于表示上下文,底層的Node-API實(shí)現(xiàn)可以使用該上下文持久保持VM-specific的狀態(tài)。
    https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_env

(2)將NapiTest類定義為js類

在定義js類之前,需要先設(shè)置js類對(duì)外導(dǎo)出的方法

// 在定義js類之前,需要先設(shè)置類對(duì)外導(dǎo)出的方法
napi_property_descriptor desc[] = {
{ "getMsg", nullptr, NapiTest::GetMsg, nullptr, nullptr, nullptr, napi_default, nullptr },
{ "setMsg", nullptr, NapiTest::SetMsg, nullptr, nullptr, nullptr, napi_default, nullptr },
{ "create", nullptr, NapiTest::Create, nullptr, nullptr, nullptr, napi_default, nullptr }
};

napi_property_descriptor

參考 https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_property_descriptor。

Node.js Node-API有一組API來(lái)獲取和設(shè)置JavaScript對(duì)象的屬性。在JavaScript中,屬性被表示為一個(gè)鍵和一個(gè)值的元組?;旧?,Node-API中的所有屬性鍵都可以用以下形式中的任一一種表示:

  • Named:一個(gè)簡(jiǎn)單的UTF-8編碼的字符串。
  • Integer-Indexed:索引值,由uint32_t表示。
  • JavaScript value:在Node-API中通過(guò)napi_value表示。它可以是一個(gè)napi_value,表示字符串、數(shù)字或符號(hào)。

typedef struct {
// utf8name和name其中一個(gè)必須是NULL
const char* utf8name;
napi_value name;

napi_callback method;
napi_callback getter;
napi_callback setter;
napi_value value;

napi_property_attributes attributes;
void* data;
} napi_property_descriptor;

參數(shù)解析:

  • utf8name:在定義js類之前設(shè)置的js類對(duì)外導(dǎo)出的方法名字,編碼為UTF8。必須為該屬性提供utf8name或name中的一個(gè)。(utf8name和name其中一個(gè)必須是NULL)。
  • name:可選的napi_value,指向一個(gè)JavaScript字符串或符號(hào),用作屬性的鍵。必須為該屬性提供utf8name或name中的一個(gè)。
  • method:將屬性描述符對(duì)象的value屬性設(shè)置為method表示的JavaScript函數(shù)。如果傳入這個(gè)參數(shù),將value、getter和setter設(shè)置為NULL(因?yàn)檫@些成員不會(huì)被使用)。
  • attributes:與特定屬性相關(guān)聯(lián)的屬性。
  • data:調(diào)用函數(shù)時(shí)傳遞給method、getter和setter的callback data。

定義與C++類相對(duì)應(yīng)的JavaScript類

napi_value constructor = nullptr;

// 定義與C++類相對(duì)應(yīng)的JavaScript類
if (napi_define_class(env, NAPI_CLASS_NAME, NAPI_AUTO_LENGTH, Constructor, nullptr, sizeof(desc) / sizeof(desc[0]),
desc, &constructor) != napi_ok) {
// "!="用來(lái)檢查兩個(gè)操作數(shù)的值是否相等,如果不相等則條件為真
return nullptr;
}

napi_define_class

napi_define_class函數(shù)說(shuō)明:
https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_define_class

napi_status napi_define_class(napi_env env,
const char* utf8name,
size_t length,
napi_callback constructor,
void* data,
size_t property_count,
const napi_property_descriptor* properties,
napi_value* result);

功能:定義與C ++ 類相對(duì)應(yīng)的JavaScript類。
參數(shù)說(shuō)明:

  • [in] env: 調(diào)用api的環(huán)境。
  • [in] utf8name: C ++ 類的名稱。
  • [in] length: C ++ 類的名稱的長(zhǎng)度,默認(rèn)自動(dòng)長(zhǎng)度使用NAPI_AUTO_LENGTH。
  • [in] constructor: 處理C ++ 類實(shí)例構(gòu)造的回調(diào)函數(shù) (因?yàn)镃onstructor函數(shù)被napi_define_class調(diào)用了)。在導(dǎo)出C ++ 類對(duì)象時(shí),這個(gè)函數(shù)必須是帶有napi_callback簽名(Constructor函數(shù)有napi_callback簽名是指要滿足typedef napi_value (*napi_callback)(napi_env, napi_callback_info);的形式)的靜態(tài)成員。不能使用c ++ 的類構(gòu)造函數(shù)。
  • [in] data: 作為回調(diào)信息的數(shù)據(jù)屬性傳遞給構(gòu)造函數(shù)回調(diào)的可選數(shù)據(jù)。
  • [in] property_count: 屬性數(shù)組中參數(shù)的個(gè)數(shù)。
  • [in] properties: 屬性數(shù)組,具體看代碼中napi_property_descriptor部分。
  • [out] result: 通過(guò)類構(gòu)造函數(shù)綁定類實(shí)例的napi_value對(duì)象。
    返回:如果API調(diào)用成功返回napi_ok。

JS構(gòu)造函數(shù)。
如果一個(gè)js函數(shù)被使用new操作符來(lái)調(diào)用了,那么這個(gè)函數(shù)就稱之為js構(gòu)造函數(shù)

C++類回調(diào)函數(shù)我們調(diào)用別人的API叫call,調(diào)用的第三方API調(diào)用我們的函數(shù)叫回調(diào)(callback)

實(shí)現(xiàn)js類的構(gòu)造函數(shù)

當(dāng)ArkTS應(yīng)用在js端通過(guò)new方法獲取類對(duì)象的時(shí)候,此時(shí)會(huì)調(diào)用 napi_define_class 中設(shè)置的 constructor 回調(diào)函數(shù),該函數(shù)實(shí)現(xiàn)方法如下:

napi_value NapiTest::Constructor(napi_env env, napi_callback_info info)
{
napi_value undefineVar = nullptr, thisVar = nullptr;
napi_get_undefined(env, &undefineVar);

// 獲取傳入的參數(shù)對(duì)象,對(duì)象不為空,根據(jù)該參數(shù)創(chuàng)建實(shí)例并并綁定到該對(duì)象
if (napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr) == napi_ok && thisVar != nullptr) {

// 創(chuàng)建NapiTest 實(shí)例
NapiTest *reference = new NapiTest(env);

// 綁定實(shí)例到對(duì)象并獲取對(duì)象的生命周期
if (napi_wrap(env, thisVar, reinterpret_cast<void *>(reference), NapiTest::Destructor, nullptr, &(reference->mRef)) == napi_ok) {
return thisVar;
}

return thisVar;
}

return undefineVar;
}

void NapiTest::Destructor(napi_env env, void *nativeObject, void *finalize)
{
// 釋放資源
NapiTest *test = reinterpret_cast<NapiTest*>(nativeObject);
test->~NapiTest();
}

  • NapiTest::Destructo方法是用來(lái)釋放創(chuàng)建的對(duì)象:

void NapiTest::Destructor(napi_env env, void *nativeObject, void *finalize)
{
// 類析構(gòu)函數(shù),釋放資源
NapiTest *test = reinterpret_cast<NapiTest*>(nativeObject);
test->~NapiTest();
}

napi_wrap

napi_status napi_wrap(napi_env env,
napi_value js_object,
void* native_object,
napi_finalize finalize_cb,
void* finalize_hint,
napi_ref* result);

功能:將C++類實(shí)例綁定到j(luò)s對(duì)象,并關(guān)聯(lián)對(duì)應(yīng)的生命周期
參數(shù)說(shuō)明:

  • [in] env: 調(diào)用api的環(huán)境。
  • [in] js_object: 綁定native_object的js對(duì)象。
  • [in] native_object: C++類實(shí)例對(duì)象。
  • [in] finalize_cb: 釋放實(shí)例對(duì)象的回調(diào)函數(shù)。
  • [in] finalize_hint: 傳遞給回調(diào)函數(shù)的數(shù)據(jù)。
  • [out] result: 綁定js對(duì)象的引用。

返回:調(diào)用成功返回0,失敗返回其他。

napi_get_cb_info

NAPI提供了napi_get_cb_info()方法可從napi_callback_info中獲取參數(shù)列表、this及其他數(shù)據(jù)。這個(gè)方法在constructor回調(diào)函數(shù)中使用,從給定的回調(diào)信息中檢索有關(guān)調(diào)用的詳細(xì)信息,如參數(shù)和This指針。

napi_status napi_get_cb_info(napi_env env,              
napi_callback_info cbinfo,
size_t* argc,
napi_value* argv,
napi_value* this_arg,
void** data)

參數(shù)說(shuō)明:

  • [in] env: 傳入接口調(diào)用者的環(huán)境,包含js引擎等,由框架提供,默認(rèn)情況下直接傳入即可。
  • [in] cbinfo: napi_callback_info對(duì)象,上下文的信息。
  • [in-out] argc: argv數(shù)組的長(zhǎng)度。若napi_callback_info中實(shí)際包含的參數(shù)的個(gè)數(shù)大于請(qǐng)求的數(shù)量argc,將只復(fù)制argc的值所指定數(shù)量的參數(shù)只argv中。若實(shí)際的參數(shù)個(gè)數(shù)小于請(qǐng)求的數(shù)量,將復(fù)制全部的參數(shù),數(shù)組多余的空間用空值填充,并將參數(shù)實(shí)際長(zhǎng)度寫(xiě)入argc。
  • [out] argv: 用于接收參數(shù)列表。
  • [out] this_arg: 用于接收this對(duì)象。
  • [out] data: NAPI的上下文數(shù)據(jù) 返回值:返回napi_ok表示轉(zhuǎn)換成功,其他值失敗。下面的返回napi_status方法一樣。

(3)導(dǎo)出js類

// 創(chuàng)建生命周期,初始引用計(jì)數(shù)設(shè)為1
if (napi_create_reference(env, constructor, 1, &sConstructor_) != napi_ok) {
return nullptr;
}

// 設(shè)置NapiTest對(duì)象相關(guān)屬性并綁定到導(dǎo)出變量exports
if (napi_set_named_property(env, exports, NAPI_CLASS_NAME, constructor) != napi_ok) {
return nullptr;
}

在設(shè)置js類導(dǎo)出前,需要先創(chuàng)建生命周期

if (napi_create_reference(env, constructor , 1, &sConstructor_) != napi_ok) {
return nullptr;
}

  • constructor 定義js類時(shí)返回的代表類的構(gòu)造函數(shù)的數(shù)據(jù)。
  • sConstructor_ 生命周期變量。
napi_create_reference

napi_create_reference為對(duì)象創(chuàng)建一個(gè)reference,以延長(zhǎng)其生命周期。調(diào)用者需要自己管理reference生命周期。

napi_create_reference函數(shù)說(shuō)明:

NAPI_EXTERN napi_status napi_create_reference(napi_env env,
napi_value value,
uint32_t initial_refcount,
napi_ref* result);

功能:通過(guò)引用對(duì)象創(chuàng)建新的生命周期引用對(duì)象。

  • [in] env: 調(diào)用 API 的環(huán)境。
  • [in] value: napi_value表示我們要引用的對(duì)象。
  • [in] initial_refcount: 生命周期變量的初始引用計(jì)數(shù)。
  • [out] result: 新建的生命周期引用對(duì)象。
    返回 napi_ok 這個(gè)API就是成功的。

將生命周期變量作為導(dǎo)出對(duì)象的傳入屬性,并將js類導(dǎo)出到exports中

//  設(shè)置constructor對(duì)象相關(guān)屬性并綁定到導(dǎo)出變量exports
if (napi_set_named_property(env, exports, NAPI_CLASS_NAME, constructor) != napi_ok) {
return nullptr;
}

napi_set_named_property

為給定對(duì)象的屬性設(shè)置一個(gè)名稱。

napi_status napi_set_named_property(napi_env env,
napi_value object,
const char* utf8Name,
napi_value value);

  • [in] env: 調(diào)用API的環(huán)境。
  • [in] object: NapiTest對(duì)象相關(guān)屬性要綁定的屬性值。
  • [in] utf8Name: js類的名稱。
  • [in] value: 要引用的對(duì)象。
    返回 napi_ok 則這個(gè)API是成功的。

設(shè)置導(dǎo)出對(duì)象的屬性

hello.cpp中:

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

napi_define_properties

https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_define_properties。

napi_status napi_define_properties(napi_env env,
napi_value object,
size_t property_count,
const napi_property_descriptor* properties);

作用:批量的向給定Object中定義屬性。

  • [in] env: 調(diào)用api的環(huán)境。
  • [in] object: js對(duì)象相關(guān)屬性的導(dǎo)出變量。
  • [in] property_count: 屬性數(shù)組中的元素?cái)?shù)。
  • [in] properties: 屬性數(shù)組。

(4)創(chuàng)建類的實(shí)例對(duì)象

  • ArkTS應(yīng)用除了調(diào)用new方法獲取類的實(shí)例外,我們也可以提供一些方法讓ArkTS應(yīng)用獲取對(duì)應(yīng)的類的實(shí)例,如在我們的NapiTest類中,定義了一個(gè)Create方法,該方法實(shí)現(xiàn)了NapiTest類實(shí)例的獲取。具體實(shí)現(xiàn)如下:

napi_value NapiTest::Create(napi_env env, napi_callback_info info) {
napi_status status;
napi_value constructor = nullptr, result = nullptr;
// 獲取生命周期變量
status = napi_get_reference_value(env, sConstructor_, &constructor);

// 創(chuàng)建生命周期內(nèi)的實(shí)例對(duì)象并將其返回
status = napi_new_instance(env, constructor, 0, nullptr, &result);
auto napiTest = new NapiTest();
// 綁定實(shí)例類創(chuàng)建NapiTest到導(dǎo)出的對(duì)象result
if (napi_wrap(env, result, reinterpret_cast<void *>(napiTest), Destructor,
nullptr, &(napiTest->mRef)) == napi_ok) {
return result;
}

return nullptr;
}

  • 在napi接口的注冊(cè)中將該方法以接口的方式導(dǎo)出,應(yīng)用層就可以直接調(diào)用該接口并獲取到該類的實(shí)例對(duì)。特別說(shuō)明:如果單獨(dú)實(shí)現(xiàn)了一個(gè)類實(shí)例獲取的方法,那么js的類構(gòu)造函數(shù)可以不實(shí)現(xiàn)(也就是定義js結(jié)構(gòu)體時(shí)實(shí)際的構(gòu)建函數(shù)Constructor及釋放資源的函數(shù)Destructor的代碼夠可以不寫(xiě))。

napi_get_reference_value

https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_get_reference_value。

函數(shù)說(shuō)明:

NAPI_EXTERN napi_status napi_get_reference_value(napi_env env,
napi_ref ref,
napi_value* result);

  • 作用:獲取與reference相關(guān)聯(lián)的js對(duì)象
  • [in] env: 調(diào)用API的環(huán)境
  • [in] ref: 生命周期管理的變量
  • [out] result: 對(duì)象引用的reference.

napi_new_instance

https://nodejs.org/docs/latest-v14.x/api/n-api.html#n_api_napi_new_instance。

napi_status napi_new_instance(napi_env env,
napi_value cons,
size_t argc,
napi_value* argv,
napi_value* result)

  • 作用:通過(guò)給定的構(gòu)造函數(shù),構(gòu)建一個(gè)對(duì)象。
  • [in] env: 調(diào)用API的環(huán)境。
  • [in] cons: napi_value表示要作為構(gòu)造函數(shù)調(diào)用的 JavaScript 函數(shù)。
  • [in] argc: argv 數(shù)組中的元素計(jì)數(shù)。
  • [in] argv: JavaScript 值數(shù)組,表示構(gòu)造函數(shù)的參數(shù)napi_value。
  • [out] result: napi_value表示返回的 JavaScript 對(duì)象。

2、 index.d.ts聲明文件編寫(xiě)

使用NAPI框架代碼生成工具,可以根據(jù).h生成.d.ts
?https://gitee.com/openharmony/napi_generator/blob/master/docs/INSTRUCTION_ZH.md。

export const create : () => NapiTest;
export class NapiTest {
setMsg(msg: string): void;
getMsg(): string;
}

也可以寫(xiě)成:

export class  NapiTest {
create();
setMsg(msg: string): void;
getMsg(): string;
}

3、CMakeLists.txt文件

# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(ObjectWrapTest)

set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

# 頭文件路徑
include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include)
# 動(dòng)態(tài)庫(kù)源文件
add_library(entry SHARED hello.cpp NapiTest.cpp)
# 依賴libace_napi.z.so動(dòng)態(tài)庫(kù)
target_link_libraries(entry PUBLIC libace_napi.z.so )

4、index.ets文件

// 讓IDE不檢查文件語(yǔ)法
// @ts-nocheck
import testNapi from "libentry.so";

@Entry
@Component

struct Index {
@State message: string = '導(dǎo)出對(duì)象'
@State nativePointer:number = 0

// 創(chuàng)建對(duì)象tt
tt = testNapi.create();

build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
console.info("[NapiTest] Test NAPI 2 + 3 = " + testNapi.add(2, 3));
try{
if (this.nativePointer == 0) {
// log打印,在程序中添加 log
console.info("[NapiTest] Test NAPI add(2, 3) 1");
this.nativePointer = testNapi.add(2, 3)
console.info("[NapiTest] Test NAPI add(2, 3) 2");

this.tt.setMsg("2+3")
console.info("[NapiTest] Test NAPI add(2, 3) 3");

} else {

console.info("[NapiTest] Test NAPI add(0, 0) 1");

this.nativePointer = testNapi.add(0, 0)
console.info("[NapiTest] Test NAPI add(0, 0) 2");

this.tt.setMsg("4+5")
console.info("[NapiTest] Test NAPI add(0, 0) 3");
}
} catch(e) {
console.info("[NapiTest]Test NAPI error" + JSON.stringify(e));
}
console.info("[NapiTest]Test NAPI " + this.tt.getMsg() + " = " + this.nativePointer);
})
}
.width('100%')
}
.height('100%')
}

}

知識(shí)點(diǎn)附送

napi接口名稱

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/native-lib/third_party_napi/napi.md

文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載:

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

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

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

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

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

2023-02-10 15:34:45

Node.jsN-API組件

2013-08-19 17:03:00

.Net生命周期對(duì)象

2021-07-19 05:52:29

網(wǎng)絡(luò)生命周期網(wǎng)絡(luò)框架

2012-06-20 10:29:16

敏捷開(kāi)發(fā)

2009-06-17 15:06:50

Hibernate實(shí)體

2012-04-28 13:23:12

Java生命周期

2013-07-29 05:11:38

iOS開(kāi)發(fā)iOS開(kāi)發(fā)學(xué)習(xí)類的'生命周期'

2015-07-08 16:28:23

weak生命周期

2022-06-01 09:25:16

嵌套生命周期智能技術(shù)工業(yè)資產(chǎn)

2023-04-19 07:50:59

?云原生生命周期管理

2010-12-03 12:22:02

局域網(wǎng)文檔文檔安全數(shù)據(jù)保護(hù)

2009-05-21 09:12:41

Java開(kāi)發(fā)平臺(tái)生命周期管理

2024-05-28 07:55:31

SpringBean用域

2022-04-19 07:20:24

軟件開(kāi)發(fā)安全生命周期SSDLC應(yīng)用安全

2013-09-26 11:20:34

Informatica

2010-05-17 22:06:41

數(shù)據(jù)安全電子文檔鼎普科技

2020-03-13 07:33:28

物聯(lián)網(wǎng)生命周期管理IOT

2012-12-04 10:02:03

2023-12-18 08:24:56

ViewModel數(shù)據(jù)操作Android

2009-03-04 10:18:50

生命周期JVMjava
點(diǎn)贊
收藏

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

bt7086福利一区国产| 国产一区二区在线| 亚洲电影第三页| 狠狠色噜噜狠狠色综合久| 日韩在线视频不卡| 日韩欧美自拍| 精品国产免费一区二区三区四区| 精品视频免费在线播放| 触手亚洲一区二区三区| 韩国毛片一区二区三区| 2021久久精品国产99国产精品| 日本爱爱爱视频| 日韩中文字幕| 欧美综合久久久| 美女av免费观看| 国产精品四虎| 国产69精品久久久久777| 精品国产亚洲一区二区三区在线| 青青青伊人色综合久久| 欧美国产日韩一区二区| 亚洲专区区免费| 精品一区二区三区中文字幕在线| 日韩欧美在线免费| 大胆欧美熟妇xx| 91视频在线观看| 成人免费av在线| 91精品久久久久久久久久入口 | 日韩影视高清在线观看| 欧美日本视频在线| 37pao成人国产永久免费视频| 成人在线观看亚洲| 中文在线资源观看网站视频免费不卡| 国产精品一区在线观看| 91欧美日韩麻豆精品| 视频一区二区中文字幕| 国内外成人免费激情在线视频网站| 中文字幕在线观看二区| 精品中文字幕一区二区三区av| 欧美大肚乱孕交hd孕妇| 亚洲无在线观看| 国产a亚洲精品| 欧美色涩在线第一页| 国产91美女视频| 91丝袜在线| 亚洲国产美女搞黄色| 欧美美女黄色网| 国产在线高潮| 亚洲天堂免费看| 正在播放一区二区三区| 97视频在线观看网站| 国产欧美视频一区二区| 日韩欧美国产二区| 狠狠狠综合7777久夜色撩人| 久久一二三国产| 老牛影视免费一区二区| 先锋av资源站| 2021久久国产精品不只是精品| 国产亚洲精品美女久久久m| 亚洲精品97久久中文字幕| 国产成人高清在线| 国产精品一区二区三区在线观| 国产 日韩 欧美 精品| 成人午夜私人影院| 国产精品久久国产三级国电话系列| www.久久成人| 成人免费av网站| 久久亚洲高清| www亚洲人| 国产精品美女久久久久aⅴ | 久久中文字幕一区二区三区| 国产suv精品一区二区三区88区| 在线永久看片免费的视频| 丝瓜av网站精品一区二区 | 大陆极品少妇内射aaaaa| 手机在线理论片| 欧美视频你懂的| 中文字幕55页| 精品亚洲精品| 亚洲一区999| 手机av在线看| 亚洲电影成人| 日本老师69xxx| 亚洲一区二区人妻| 国产成人一区二区精品非洲| 国产综合欧美在线看| 国产区av在线| 亚洲综合成人在线| 日韩精品一区二区三区色欲av| 日韩成人在线电影| 精品蜜桃在线看| 韩国女同性做爰三级| 羞羞色午夜精品一区二区三区| 欧美激情精品久久久久久免费印度| 制服.丝袜.亚洲.中文.综合懂色| 日本不卡不码高清免费观看| 99免费在线观看视频| 日本一区视频| 一区二区三区四区高清精品免费观看| 无码播放一区二区三区| 婷婷久久免费视频| 亚洲国产精品久久久久| 天堂av网手机版| 亚洲精品美女| 亚洲精品欧美极品| 免费在线性爱视频| 一区二区三区蜜桃网| 黄色片一级视频| 国产成人夜色高潮福利影视| 一本色道久久综合狠狠躁篇的优点 | 亚洲一线在线观看| 99久久久久久| 蜜臀av.com| 欧美暴力调教| 亚洲激情成人网| 午夜精品福利在线视频| 日日夜夜免费精品| 国产在线一区二区三区播放| 毛片在线播放a| 色综合久久综合| 乱码一区二区三区| 香港欧美日韩三级黄色一级电影网站| 日本不卡高字幕在线2019| 亚洲国产福利视频| 亚洲品质自拍视频| 欧美一级裸体视频| 国产91精品对白在线播放| 久久久在线观看| 国产美女免费视频| 中文字幕一区二区三区精华液| 国产偷人视频免费| 老牛精品亚洲成av人片| 欧美黑人性视频| 99久久精品国产色欲| 亚洲色图在线播放| av亚洲天堂网| 久久影视一区| 国产欧美一区二区| 视频免费一区| 欧美日韩视频在线一区二区| 久久久久久久毛片| 日韩精品乱码免费| 欧美一级日本a级v片| 二区三区不卡| 亚洲网在线观看| 五月婷婷六月婷婷| 久久久精品免费免费| 国产欧美在线一区| 午夜a一级毛片亚洲欧洲| 国内自拍欧美激情| 亚洲色图另类小说| 高跟丝袜欧美一区| av网站免费在线看| 天堂av在线一区| 日韩尤物视频| 黄色成人在线观看网站| 搡老女人一区二区三区视频tv| 在线免费观看av片| 亚洲人成在线观看一区二区| 91视频福利网| 黄色一区二区三区四区| 成人综合色站| 日韩电影毛片| 亚洲午夜色婷婷在线| 日韩国产亚洲欧美| 亚洲欧美一区二区视频| 欧美一级片在线免费观看| 99热精品在线观看| 日本一区二区三区视频免费看| 国产一区二区三区朝在线观看| 日韩在线观看免费av| 99久久国产热无码精品免费| 亚洲成人综合视频| 亚洲精品成人无码| 久久99精品网久久| 精品成在人线av无码免费看| 天堂av一区二区三区在线播放 | 日韩免费一级| 欧美一区二区色| www.91在线| 日韩免费高清av| 久久精品视频1| 中文字幕在线播放不卡一区| 极品人妻一区二区| 免费久久99精品国产自在现线| 亚洲乱码一区二区三区| 中文字幕日韩高清在线| 欧美在线激情网| 欧美激情黑人| 日韩电影免费在线观看中文字幕| 黄色污污视频软件| 亚洲综合成人在线视频| 欧洲美一区二区三区亚洲| 狠狠狠色丁香婷婷综合激情| 国产中文字幕在线免费观看| 天天精品视频| 精品久久久久久一区| 欧美激情福利| 91chinesevideo永久地址| 国产免费视频在线| 精品国产乱码久久久久久影片| 日韩免费av网站| 亚洲国产综合91精品麻豆| 粉嫩精品久久99综合一区| 国产福利精品一区| 日本特黄a级片| 国产情侣一区| 福利在线小视频| 欧美色图一区| 玖玖玖精品中文字幕| 亚洲乱码一区| 91精品国产综合久久香蕉最新版 | 色综合久久中文字幕| 国产免费美女视频| 久久精品欧美一区二区三区麻豆| 欧美又黄又嫩大片a级| 模特精品在线| 欧美日韩福利在线| 亚洲视频电影在线| 色一情一乱一伦一区二区三区丨 | 成人av三级| 国内精品久久久久影院优 | 欧洲一区av| 精品国产乱码久久久久久蜜臀| 国产孕妇孕交大片孕| 91传媒视频在线播放| 久久久久久久久影院| 亚洲国产欧美日韩另类综合| 青娱乐在线视频免费观看| 国产精品久久久久久久久免费相片 | 亚洲精品mv在线观看| 久久午夜电影| 黄www在线观看| 亚洲深夜影院| 女性女同性aⅴ免费观女性恋| 国产精品99一区二区| 永久免费网站视频在线观看| 久久综合成人| 在线观看成人av电影| 欧美丝袜一区| 午夜精品区一区二区三| 精品视频免费| 亚洲精品欧美精品| 成人久久久久| 亚洲综合欧美日韩| 久久一区二区三区电影| 一区二区三区视频| 欧美独立站高清久久| 中文网丁香综合网| 一区二区中文| japanese在线播放| 影音先锋久久资源网| av免费观看大全| 午夜一区在线| 无码日韩人妻精品久久蜜桃| 日韩高清在线电影| 欧美女同在线观看| 国产一区二区在线观看视频| 成人免费播放视频| 成人精品国产福利| 成人手机在线免费视频| 久久色在线观看| 97人妻人人揉人人躁人人| 欧美激情在线一区二区三区| 人妻互换一区二区激情偷拍| 亚洲色欲色欲www| 国产天堂av在线| 亚洲一区二区三区爽爽爽爽爽| 日本一级一片免费视频| 91搞黄在线观看| 国产精品嫩草影院桃色| 欧美成人a视频| 午夜黄色小视频| 一区二区三区视频免费| www在线免费观看视频| 欧美精品www| 亚洲日本网址| 97se在线视频| 中文字幕精品影院| 亚洲精品偷拍视频| 在线亚洲自拍| 亚洲天堂av线| 成人丝袜18视频在线观看| 国产激情在线免费观看| 中文字幕日韩一区| 日韩欧美三级在线观看| 在线观看视频一区二区欧美日韩 | 亚洲精品国产精品乱码不99按摩| 国产精品一区二区三区四区色| 欧美裸体xxxx极品少妇| 最新欧美色图| 91在线直播亚洲| 希岛爱理av免费一区二区| 一区二区三区国| 999亚洲国产精| 视频免费1区二区三区| 97se亚洲国产综合自在线| 99热6这里只有精品| 精品高清一区二区三区| 一区二区日韩在线观看| 日韩精品中文字幕在线| 成人日日夜夜| 国产91久久婷婷一区二区| 午夜免费欧美电影| 亚洲精品日韩成人| 久久性天堂网| 亚洲麻豆一区二区三区| 亚洲视频一区二区在线观看| 亚洲天堂视频网站| 精品日韩一区二区三区| 日本在线观看www| 欧美一区在线直播| eeuss鲁片一区二区三区| 一区二区三区视频在线播放| 三级亚洲高清视频| xfplay5566色资源网站| 亚洲少妇屁股交4| 91国内精品久久久| 国产亚洲人成a一在线v站| 欧美伦理91| 超碰97在线资源| 午夜精品一区二区三区国产| 中文字幕乱码人妻综合二区三区 | 日韩片电影在线免费观看| 亚洲久久视频| 风韵丰满熟妇啪啪区老熟熟女| 中文字幕一区二区不卡| 亚洲av人无码激艳猛片服务器| 亚洲国产精品va在线| 手机电影在线观看| 91九色视频导航| 久久网站免费观看| 午夜宅男在线视频| 国产视频一区在线观看| 人人爽人人爽人人片av| 日韩电影中文字幕av| av日韩国产| 国产精品日韩二区| 激情丁香综合| 国产高潮失禁喷水爽到抽搐| 艳妇臀荡乳欲伦亚洲一区| 精品国产av一区二区三区| 欧美成人一二三| 午夜电影一区| 国产精品无码免费专区午夜| 顶级嫩模精品视频在线看| 精品视频一区二区在线观看| 欧美大片免费久久精品三p| 国产乱码在线| 精品乱色一区二区中文字幕| 在线亚洲免费| 成人性生交大免费看| 在线中文字幕一区| 国产色在线 com| 国产精品免费视频xxxx| 日韩高清欧美| 亚洲精品国产久| 亚洲精品国产视频| 丰满岳乱妇国产精品一区| 97视频在线观看网址| 任我爽精品视频在线播放| 精品视频无码一区二区三区| 日本一区二区三区国色天香| 一级片视频网站| 欧美激情精品久久久久久黑人| 欧美自拍视频| 亚洲老女人av| 一区二区三区免费| 青梅竹马是消防员在线| 国产精品一区二区久久久久| 综合久久亚洲| av2014天堂网| 欧美日韩精品福利| 欧美黑人猛交| 日韩精品一区二区三区丰满| 黄一区二区三区| 日本三级视频在线| 在线视频日韩精品| 国内精品视频| 成人免费aaa| 国产精品久久久久久福利一牛影视 | 亚洲аv电影天堂网| 粉嫩一区二区三区| 国产三级中文字幕| 91美女蜜桃在线| 一区二区三区午夜| 午夜精品久久久久久99热| 精品久久一区| 久久人妻少妇嫩草av蜜桃| 在线亚洲一区二区| 午夜成年人在线免费视频| 欧洲久久久久久| 成人综合在线网站| 正在播放木下凛凛xv99| 国模精品视频一区二区| 成人3d精品动漫精品一二三| aaa黄色大片| 欧美高清视频www夜色资源网| 蜜桃视频在线观看播放| 熟女熟妇伦久久影院毛片一区二区| 91在线看国产|