通过 Rhino 将 ByteArray 传递给 javascript 时参数无效
Invalid argument when passing ByteArray to javascript through Rhino
我正在使用 Rhino 来评估一些 javascript,我只是将 ByteArray 从 kotlin 传递给 Javascript 中的函数。我知道这样说有点不好意思,但我在 Swift 和 .Net Core 中使用相同的 Js 文件,在这种情况下失败的行没有问题。
如下,我将 bytes
,一个 ByteArray,传递给 JS 函数 decodeByteArray()
。失败的那一行是我用注释 //invalid argument
标记的那一行
我检查了 ByteArray 的内容,它们符合预期。
我是不是做错了什么或遗漏了什么?
Javascript
function decodeByteArray(buf) {
var pbf = new Pbf(buf);
return JSON.stringify(decode(pbf));
}
function Pbf(buf) {
this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf);
this.pos = 0;
this.type = 0;
this.length = this.buf.length;
setUp(this);
}
Kotlin
private fun decodePbfBytes(bytes: ByteArray?): Any? {
var jsResult: Any? = null;
var params = arrayOf(bytes)
val rhino = org.mozilla.javascript.Context.enter()
rhino.optimizationLevel = -1
rhino.languageVersion = org.mozilla.javascript.Context.VERSION_ES6
try{
val scope = rhino.initStandardObjects()
val assetManager = MyApp.sharedInstance.assets
val input = assetManager.open("pbfIndex.js") //the js file containing js code
val targetReader = InputStreamReader(input)
rhino.evaluateReader(scope, targetReader, "JavaScript", 1,null)
val obj = scope.get("decodeByteArray", scope)
if (obj is org.mozilla.javascript.Function){
jsResult = obj.call(rhino, scope, scope, params)
jsResult = org.mozilla.javascript.Context.toString(jsResult)
}
}catch (ex: Exception){
Log.e("Error", ex.localizedMessage)
}finally {
org.mozilla.javascript.Context.exit()
}
return jsResult
}
Rhino 的 TypedArray 支持有点欠缺(参见 https://mozilla.github.io/rhino/compat/engines.html#ES2015-built-ins-typed-arrays)
我无法让构造函数直接获取 byte[],但它在转换为 javascript 数组后起作用了。
我相信将 new Uint8Array(buf);
更改为 new Uint8Array(Array.from(buf));
会奏效
虽然 Uint8Array.from
未实现,但 Array.from
已实现。
我正在使用 Rhino 来评估一些 javascript,我只是将 ByteArray 从 kotlin 传递给 Javascript 中的函数。我知道这样说有点不好意思,但我在 Swift 和 .Net Core 中使用相同的 Js 文件,在这种情况下失败的行没有问题。
如下,我将 bytes
,一个 ByteArray,传递给 JS 函数 decodeByteArray()
。失败的那一行是我用注释 //invalid argument
我检查了 ByteArray 的内容,它们符合预期。
我是不是做错了什么或遗漏了什么?
Javascript
function decodeByteArray(buf) {
var pbf = new Pbf(buf);
return JSON.stringify(decode(pbf));
}
function Pbf(buf) {
this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf);
this.pos = 0;
this.type = 0;
this.length = this.buf.length;
setUp(this);
}
Kotlin
private fun decodePbfBytes(bytes: ByteArray?): Any? {
var jsResult: Any? = null;
var params = arrayOf(bytes)
val rhino = org.mozilla.javascript.Context.enter()
rhino.optimizationLevel = -1
rhino.languageVersion = org.mozilla.javascript.Context.VERSION_ES6
try{
val scope = rhino.initStandardObjects()
val assetManager = MyApp.sharedInstance.assets
val input = assetManager.open("pbfIndex.js") //the js file containing js code
val targetReader = InputStreamReader(input)
rhino.evaluateReader(scope, targetReader, "JavaScript", 1,null)
val obj = scope.get("decodeByteArray", scope)
if (obj is org.mozilla.javascript.Function){
jsResult = obj.call(rhino, scope, scope, params)
jsResult = org.mozilla.javascript.Context.toString(jsResult)
}
}catch (ex: Exception){
Log.e("Error", ex.localizedMessage)
}finally {
org.mozilla.javascript.Context.exit()
}
return jsResult
}
Rhino 的 TypedArray 支持有点欠缺(参见 https://mozilla.github.io/rhino/compat/engines.html#ES2015-built-ins-typed-arrays)
我无法让构造函数直接获取 byte[],但它在转换为 javascript 数组后起作用了。
我相信将 new Uint8Array(buf);
更改为 new Uint8Array(Array.from(buf));
虽然 Uint8Array.from
未实现,但 Array.from
已实现。