Dart:如何在本机扩展中创建流

Dart:如何在本机扩展中创建流,dart,dart-native-extension,Dart,Dart Native Extension,在我的本机扩展中,我需要将INT流式传输到我的Dart控制台应用程序。在概念上非常类似于 斯丁。如何创建向console应用程序公开的本机Dart流对象?我已经尝试为您创建一个示例,并将其放在github上 如果您希望看到它在运行,您应该编译它并运行它 构建脚本位于bin/makefile.dart 示例脚本位于bin/Example\u使用\u sample\u extension.dart 如果您只想查看源代码示例,可以在下面查看 示例\u使用\u示例\u扩展名.dart 导入“包:列表/

在我的本机扩展中,我需要将INT流式传输到我的Dart控制台应用程序。在概念上非常类似于
斯丁。如何创建向console应用程序公开的本机Dart流对象?

我已经尝试为您创建一个示例,并将其放在github上

如果您希望看到它在运行,您应该编译它并运行它

构建脚本位于
bin/makefile.dart

示例脚本位于
bin/Example\u使用\u sample\u extension.dart

如果您只想查看源代码示例,可以在下面查看

示例\u使用\u示例\u扩展名.dart

导入“包:列表/列表.dart”; 导入“package:native_extension_with_stream/sample_extension.dart”; void main(){ 打印(“范围从0到5”); var stream=NativeStream.createStream(新范围列表(0,5)); stream.listen((数据){ 打印(数据); },onDone:(){ 打印(“第2步从-5到5的收集”); var stream=NativeStream.createStream(新的步骤列表(-5,5,2)); stream.listen((数据){ 打印(数据); }); }); } 样本扩展。省道

library native\u extension\u with\u stream.sample\u extension;
导入“dart ext:sample_扩展”;
导入“dart:async”;
本地流类{
静态流createStream(Iterable集合){
if(集合==null){
抛出新ArgumentError(“collection:$collection”);
}
返回_createStream(集合);
}
静态流\u createStream(Iterable集合)本机
“CreateStream”;
}
sample_extension.cc

#包括
#包括
#包括
#ifdef_WIN32
#包括“windows.h”
#否则
#包括
#包括
#包括
#包括
#恩迪夫
#包括“dart_api.h”
Dart_NativeFunction ResolveName(Dart_句柄名称、int argc、bool*自动设置范围);
DART\ U导出DART\ U句柄示例\扩展\初始化(DART\ U句柄父\库){
if(Dart_IsError(parent_library)){return parent_library;}
Dart_Handle result_code=Dart_SetNativeResolver(父库,解析名称,NULL);
if(Dart_IsError(result_code))返回result_code;
返回Dart_Null();
}
省道手柄错误(省道手柄){
如果(省道错误(手柄))省道错误(手柄);
返回手柄;
}
void CreateStream(Dart_NativeArguments参数){
镖柄系列;
Dart\u句柄库\u异步;
镖柄库芯;
省道处理结果;
飞镖柄流;
省道手柄类型;
飞镖柄式流;
Dart\u句柄url\u异步;
省道手柄url\u核心;
Dart_肠镜();
集合=Dart_GetNativeArgument(参数,0);
url_async=Dart_NewStringFromCString(“Dart:async”);
url_core=Dart_NewStringFromCString(“Dart:core”);
库异步=Dart\u LookupLibrary(url\u async);
library\u core=Dart\u LookupLibrary(url\u core);
type\u int=Dart\u GetType(库核心,Dart\u NewStringFromCString(“int”),0,NULL);
type_stream=Dart_GetType(库_核心,Dart_NewStringFromCString(“流”),0,NULL);
stream=Dart\u New(类型\u stream、Dart\u NewStringFromCString(“fromIterable”)、1和collection);
Dart_SetReturnValue(参数、流);
Dart_ExitScope();
}
结构函数查找{
常量字符*名称;
省道功能;
};
函数查找函数列表[]={
{“CreateStream”,CreateStream},
{NULL,NULL};
Dart_NativeFunction ResolveName(Dart_句柄名称、int argc、bool*自动设置范围){
如果(!Dart_IsString(name))返回NULL;
Dart_NativeFunction结果=空;
Dart_肠镜();
const char*cname;
HandleError(Dart_StringToCString(名称和cname));
对于(int i=0;函数列表[i]。名称!=NULL;++i){
if(strcmp(函数列表[i].name,cname)==0){
结果=函数\列表[i]。函数;
打破
}
}
Dart_ExitScope();
返回结果;
}
附言

以下是构建脚本的源代码:

makefile.dart

导入“dart:io”;
导入“包:ccompilers/ccompilers.dart”;
导入“包:build_tools/build_shell.dart”;
导入“包:构建工具/build工具.dart”;
导入“包:file_utils/file_utils.dart”;
导入“package:patsubst/top_level.dart”;
void main(列表参数){
常量字符串项目\u NAME=“示例\u扩展”;
常量字符串LIBNAME_LINUX=“lib$PROJECT_NAME.so”;
常量字符串LIBNAME\u MACOS=“lib$PROJECT\u NAME.dylib”;
常量字符串LIBNAME_WINDOWS=“$PROJECT_NAME.dll”;
//确定操作系统
var os=平台操作系统;
//为扩展设置Dart SDK位
var bits=DartSDK.getVmBits();
//编译器选项
var compilerDefine={};
var compilerInclude=['$DART_SDK/bin','$DART_SDK/include'];
//链接器选项
var linkerLibpath=[];
//操作系统相关参数
var libname=“”;
var objExtension=“”;
交换机(os){
案例“linux”:
libname=libname_LINUX;
objExtension=“.o”;
打破
案例“macos”:
libname=libname_MACOS;
objExtension=“.o”;
打破
案例“窗口”:
libname=libname\u窗口;
objExtension=“.obj”;
打破
违约:
打印(“不支持的操作系统:$os”);
出口(-1);
}
// http://dartbug.com/20119
var bug20119=Platform.script;
//设置工作目录
FileUtils.chdir(“../lib/src”);
//C++文件
var cppFiles=FileUtils.glob(“*.cc”);
如果(操作系统!=“windows”){
cppFiles=FileUtils.exclude(cppFiles,“sample_extension_dllmain_win.cc”);
}
cppFiles=cppFiles.map((e)=>FileUtils.basename(e));
//对象文件
var objFiles=patsubst(“%.cc”,“%${objExtension}”).replaceAll(cppFiles);
//生成文件
//目标:默认值
target(“default”、[“build”],null,description:“build and clean.”);
//目标:建立
目标(“构建”、“清除所有”、“编译链接”、“清除”],(目标t,映射参数){
打印(“The${t.name}successful.”);
},说明:“生成“$PROJECT\u NAME.”;
//目标:编译链接
目标(“编译链接”,[libname],(目标t,映射ar