Unity中通过Jint调用js库

在最近的一个项目中遇到了一个需求,一个现有的加密解密的库是Javascript写的,且已经用到了服务器代码中,所以我这边客户端这边有两个选择:

  • “翻译”过来,将JS库中的代码用C#写一遍,但其中很多方法差异很大,js代码作为弱类型语言在很多二进制操作上显得非常宽泛,使得移植代码比较麻烦;
  • 找到一个可以用C#直接调用JS库的方案;

通过一段时间调研,首先在AssetStore上找到一个库:*Jurassic *,可以使得通过C#调用JS方法,但是实例当中调用的代码都是非常简单的一个运算过程,而我需要调用的是一个js的库。

然后我找到了一个C#调用JS的方案:Jint和一篇文章:Jint: Invoke Javascript from .NET;

里面提到了一个调用js库的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static void Handlebars()
{
var engine = new Jint.Engine();

engine.Execute(File.ReadAllText("handlebars-v4.0.11.js"));

engine.SetValue("context", new
{
cats = new[]
{
new {name = "Feivel"},
new {name = "Lilly"}
}
});

engine.SetValue("source", " says meow!!!\n");

engine.Execute("var template = Handlebars.compile(source);");

var result = engine.Execute("template(context)").GetCompletionValue();

Console.WriteLine(result);
}

简单来说就是通过File读取库文件(不需要更改后缀),用过SetValue设置参数名称和值,用过Execute传入一段字符串来调用代码,得到结果。

js库中的代码主要为encodedecode:

1
2
3
4
5
6
7
8
encode:function( mix,depth) {
````
return rv;
}
````
decode :function(data, first){
return str;
}

而c#中的调用代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var engine = new Engine();

engine.Execute(File.ReadAllText("Assets/MsgPack.js"));

List<object> fu = new List<object>();

engine.SetValue("mix","fuckyou");

engine.SetValue("depth",0);

var end = engine.Execute("msgPack.encode(mix,depth);").GetCompletionValue();

print(end);

var dataArr = end.AsArray();

print("fuck " + dataArr);

engine.SetValue("data",dataArr);

engine.SetValue("first","fuckyou");

var out_str = engine.Execute("msgPack.decode(data,first);").GetCompletionValue();

print(out_str);