API称作应用程序接口,在UOL中又称之为native方法。Native方法是不需要定义就可以直接调用的方法。Native方法通常是跟直接硬件相关的方法,在设计完之后可以将native方法封装到类(class)中以便其他人安全的使用。
在UOL中制作native时,首先要在native.xml中声明native方法,声明格式如下:
<native>
<function name =
"doSysPrintChar" id = "0::0" length = "1" type =
"char" return = "void"/>
。。。。
</native>
1. name 后面用双引号声明方法的名称
2. id是方法所在二位数组中的地址
3. length是指方法参数的个数
4. type后面声明每个参数的类型,用空格来区分每个声明。仅支持如下声明格式:
void,char,short,int,long,float,double,charArray,shortArray,intArray,floatArray,doubleArray
(注明: 数组的声明 类型+Array)
5.
return 是指返回值,声明格式如上
在移植到单片机时需设计native函数,设计方法如下:
例如:
//int doLcdReadPoint (int x,int y);
CELL doLcdReadPoint(MicroVM* vm, CELL* params)
{
CELL res;
//参数的映射
int32_t
x = params[0].ival;
int32_t y = params[1].ival;
//函数的映射
res.ival = LCD_ReadPoint(x,y);
//如果返回值是void,zeroCell.ival
= 0,否则zeroCell.ival = 1;
zeroCell.ival = 1;
//返回值
return res;
}
定义完API之后,在nativetable.c中申请id就可以完成,申请如下:
API的id格式: id =
id1::id2
//设定id2
NativeMethod Natives2[] =
{
doLcdInit,
doLcdOnOff,
doLcdClrScr,
doLcdReadPoint,//添加设计的native函数
doLcdWritePoint,
doLcdWriteChar,
};
//设定id1
NativeMethod* nativeTable[] =
{
Natives0,
Natives1,
Natives2,
};
//不要忘记增加一个case来检查id的范围
int isNativeValid(int id1, int id2)
{
switch(id1)
{
case 0:
if (id2 >= 3) return 0;
else return Natives0[id2] != NULL;
case 1:
if (id2 >= 5) return 0;
else return Natives1[id2] != NULL;
case 2:
if (id2 >= 6) return 0;
else return Natives2[id2] != NULL;
default:
return 0;
}
} |