了解更多开源信息,请访问:开源基础软件社区https://ost.51cto.com。本文主要分享如何在软通动力扬帆系列“竞品”OpenHarmony开发板上测试NativeC++应用开发,实现eTS调用NativeC++程序实现给定两个数的加减乘除示例(eTS)1.新建一个OpenHarmonyNativeForC++项目,选择File->New->CreateProject->OpenHarmony->NativeC++,点击Next。输入项目名称,选择SDK版本9,然后单击完成。如果没有下载NativeSDK,会出现如下界面。点击ConfigureNow下载NativeSDK。NativeSDK下载完成后,点击Finish进入项目。2.源码修改(1)项目主要文件说明项目初始化完成后,目录结构如下图所示。主要文件就是红框中的文件。主要文件说明如下:├──cpp:C++代码区│├──types://接口存放文件夹││└──libentry││├──index.d.ts//接口文件││└──package.json//接口注册配置文件│├──CmakeList.txt//Cmake打包配置文件│└──hello.cpp//C++源码└──ets//ets代码区└──应用│└──AbilityStage.ts//Hap封装运行时类├──MainAbility│└──MainAbility.ts//Ability,提供Ability生命周期、上下文等的调用管理└──pages└──index.ets//Mainpage(2)cpp源码编写的内置案例,实现了加法运算的接口。本例在此基础上增加了减法、乘法和除法。entry\src\main\cpp\hello.cpp主要修改如下。参考“Add”方法实现Sub、Mul、Div。staticnapi_valueSub(napi_envenv,napi_callback_infoinfo){size_trequireArgc=2;size_targc=2;napi_valueargs[2]={nullptr};napi_get_cb_info(env,info,&argc,args,nullptr,nullptr);napi_valuetypevaluetype0;napi_typeof(env,args[0],&valuetype0);napi_valuetypevaluetype1;napi_typeof(env,args[1],&valuetype1);双值0;napi_get_value_double(env,args[0],&value0);双倍值1;napi_get_value_double(env,args[1],&value1);napi_value总和;napi_create_double(env,value0-value1,&sum);返回总和;}staticnapi_valueMul(napi_envenv,napi_callback_infoinfo){size_trequireArgc=2;size_targc=2;napi_valueargs[2]={nullptr};napi_get_cb_info(env,info,&argc,args,nullptr,nullptr);napi_valuetypevaluetype0;napi_typeof(env,args[0],&valuetype0);napi_valuetypevaluetype1;napi_typeof(env,args[1],&valuetype1);双值0;napi_get_value_double(env,args[0],&value0);双倍值1;napi_get_value_double(env,args[1],&value1);napi_value总和;napi_create_double(env,value0*value1,&sum);returnsum;}staticnapi_valueDiv(napi_envenv,napi_callback_infoinfo){size_trequireArgc=2;size_targc=2;napi_valueargs[2]={nullptr};napi_get_cb_info(env,info,&argc,args,nullptr,nullptr);napi_valuetypevaluetype0;napi_typeof(env,args[0],&valuetype0);napi_valuetypevaluetype1;napi_typeof(env,args[1],&valuetype1);双值0;napi_get_value_double(env,args[0],&value0);双倍值1;napi_get_value_double(env,args[1],&value1);napi_value总和;napi_create_double(env,value0/value1,&sum);returnsum;}Init中注册表对外接口命名为“sub”、“mul”、“div”EXTERN_C_STARTstaticnapi_valueInit(napi_envenv,napi_valueexports){napi_property_descriptordesc[]={{"add",nullptr,Add,nullptr,nullptr,nullptr,napi_default,nullptr},{"sub",nullptr,Sub,nullptr,nullptr,nullptr,napi_default,nullptr},{"mul",nullptr,Mul,nullptr,nullptr,nullptr,napi_default,nullptr},{"div",nullptr,Div,nullptr,nullptr,nullptr,napi_default,nullptr},};napi_define_properties(env,exports,sizeof(desc)/sizeof(desc[0]),desc);returnexports;}EXTERN_C_END(3)index.d.ts接口文件编写src/main/cpp/types/libentry/index.d.ts,添加如下接口:exportconstsub:(a:number,b:number)=>数字;exportconstmul:(a:number,b:number)=>number;exportconstdiv:(a:number,b:number)=>number;(4)接口实现src/main/ets/pages/index.ets通过importtestNapifrom'libentry.so'导入SO包,点击按钮时调用对应方法importtestNapifrom'libentry.so'@Entry@ComponentstructIndex{私有文本输入Controller1:TextInputController=newTextInputController()privatetextInputController2:TextInputController=newTextInputController()privatetitle:string='调用C标准库示例'privatemessage:string='给定两个数的加减乘除'privatetipsNum1:string='请输入第一个数字:'privatetipsNum2:string='请输入第二个数字:'privatetipsResult:string='Result:'privatebuttonAdd:string='Add'privatebuttonSub:string='Minus'privatebuttonMul:string='multiply'privatebuttonDiv:string='divide'@State结果:number=0@Statenum1:number=0.0@Statenum2:number=0.0build(){Row(){Column(){Row(){Text(this.tittle).height('100%').align(Alignment.Center).fontSize(40).fontWeight(800)}.height('10%').width('100%').justifyContent(FlexAlign.Center)Row(){文本(this.message).height('100%').align(Alignment.Center).fontSize(24).fontWeight(500)}.height('15%').width('100%').justifyContent(FlexAlign.Center)行(){Text(this.tipsNum1).fontColor(Color.Black).fontSize(24).width('30%').height('100%').margin({left:30})TextInput({placeholder:'请输入第一个数字:',controller:this.textInputController1}).type(InputType.Number).height('100%').width('60%').margin({left:10,right:30}).onChange(value=>{this.num1=parseFloat(value)})}.height('5%').width('100%').justifyContent(FlexAlign.Start)Row(){Text(this.tipsNum2).fontColor(Color.Black).fontSize(24).width('30%').height('100%').margin({left:30})TextInput({placeholder:'请输入第二个数字:',controller:this.textInputController2}).type(InputType.Number).height('100%').width('60%').margin({left:10,right:30}).onChange(value=>{this.num2=parseFloat(value)})}.height('5%').width('100%').margin({top:20})Row(){Text(this.tipsResult).fontColor(Color.Black).fontSize(24).width('40%').height('100%').margin({left:30})Text(''+this.result).fontColor(Color.Black).fontSize(30).width(60).height(200).width('60%').height('100%')}.height('10%').width('100%').touchable(false)Row(){按钮(this.buttonAdd).fontSize(40).fontWeight(FontWeight.Bold).margin({top:5}).height(100).width(100).onClick(()=>{this.result=testNapi.add(this.num1,this.num2)})按钮(this.buttonSub).fontSize(40).fontWeight(FontWeight.Bold).margin({top:5}).height(100).width(100).onClick(()=>{this.result=testNapi.sub(this.num1,this.num2)})按钮(this.buttonMul).fontSize(40).fontWeight(FontWeight.Bold).margin({top:5}).height(100).width(100).onClick(()=>{this.result=testNapi.mul(this.num1,this.num2)})按钮(this.buttonDiv).fontSize(40).fontWeight(FontWeight.Bold).margin({top:5}).height(100).width(100).onClick(()=>{this.result=testNapi.div(this.num1,this.num2)})}.height('30%').width('100%').justifyContent(FlexAlign.Center)}.width('100%')}.height('100%')}}3.运行效果演示加法:减法乘法除法更多开源请访问:开源基础软件社区https://ost.51cto.com
