mre应用和Native的交互之增加mre sdk接口
经常碰到mre sdk功能不够完善的情况,没有实现功能的API,这个时候怎么办呢?在mtk 的Native端(也就是CodeBase里)增加接口,扩展到mre的sdk中。下面是扩展mtk Mre sdk接口的具体步骤。现在以vm_extra_add(int a, int b),这个接口为例,扩展这个接口,将接口定义在native端,然后再mre应用中调用之。类似的,如果要将mtk native端其他的函数扩展到mre应用中调用,都类似的可参考。
1、增加接口,找到native端 mre\engine\framework下的Vmpromng.c,在里面增加如下函数
VMINT vm_extra_add(VMINT a, VMINT b)
{
return a + b;
}
2、native端扩展接口,找到Vmpromng.c中的VMINT vm_get_sym_entry(char* symbol)函数,其实很多mre的接口都在这里扩展,可以看到类似下面的代码
if(strcmp(symbol,"vm_pn_is_support") == 0)
return (VMINT)vm_pn_is_support;
if(strcmp(symbol,"vm_pn_get_global_setting") == 0)
return (VMINT)vm_pn_get_global_setting;
if(strcmp(symbol,"vm_pn_reg") == 0)
return (VMINT)vm_pn_reg;
if(strcmp(symbol,"vm_pn_dereg") == 0)
return (VMINT)vm_pn_dereg;
这其实就是扩展接口,根据symbol的值,返回不同接口的地址,现在要增加vm_extra_add接口,则增加如下line 5-6代码,remake一下。
if(strcmp(symbol,"vm_pn_is_support") == 0)
return (VMINT)vm_pn_is_support;
if(strcmp(symbol,"vm_pn_get_global_setting") == 0)
return (VMINT)vm_pn_get_global_setting;
if(strcmp(symbol, "vm_extra_add") == 0)
return (VMINT)vm_extra_add;
if(strcmp(symbol,"vm_pn_reg") == 0)
return (VMINT)vm_pn_reg;
if(strcmp(symbol,"vm_pn_dereg") == 0)
return (VMINT)vm_pn_dereg;
3、在mre应用中使用新增加的vm_extra_add接口,以下是mre2.0的使用新增接口的使用,只需保证MRE_ENTRY("vm_extra_add");中的红色字体和if(strcmp(symbol,
"vm_extra_add") == 0)中红色字体一致即可获取出函数地址。
#include "vmsm.h"
typedef VMINT (*VmExtraAdd)(VMINT a, VMINT b);
void vm_extra_add_test()
{
VmExtraAdd* vm_extra_add = NULL;
int a = 1, b = 2, c;
vm_extra_add = (VmExtraAdd)MRE_ENTRY("vm_extra_add");
if(NULL != vm_extra_add)
{
c = vm_extra_add(a, b);
}
}
当然Mre 1.0的使用接口方法会有点不同,看下面的代码
#include "vmsm.h"
typedef VMINT (*VmExtraAdd)(VMINT a, VMINT b);
extern vm_get_sym_entry_t vm_get_sym_entry;
void vm_extra_add_test()
{
VmExtraAdd* vm_extra_add = NULL;
int a = 1, b = 2, c;
vm_extra_add = (VmExtraAdd)vm_get_sym_entry("vm_extra_add");
if(NULL != vm_extra_add)
{
c = vm_extra_add(a, b);
}
}
不积跬步无以至千里,不积小流无以成江河。