搜索
查看: 990|回复: 3

创建回调函数时类型声明问题

[复制链接]

42

主题

128

帖子

924

积分

荣誉会员

Rank: 8Rank: 8

积分
924
发表于 2018-2-1 15:51:07 | 显示全部楼层 |阅读模式
本帖最后由 cad 于 2018-2-1 15:52 编辑

测试用到的dll下载 https://aka.ms/chakracore/cc_windows_all_1_8_0

文档中的回调函数声明  https://github.com/Microsoft/ChakraCore/wiki/JsNativeFunction

typedef _Ret_maybenull_ JsValueRef(CALLBACK * JsNativeFunction)(_In_ JsValueRef callee, _In_ bool isConstructCall, _In_ JsValueRef *arguments, _In_ unsigned short argumentCount, _In_opt_ void *callbackState);

我的声明
var func_c = ..raw.tocdecl(function(callee, isConstructCall, arguments, argumentCount, callbackState){
    console.log( callee, isConstructCall, arguments, argumentCount, callbackState )
   
   
var ret = {ptr value}
    ::ChakraCore.JsGetNullValue(ret)
   
return ret.value;      
},
"ptr(ptr callee, bool isConstructCall,ptr arguments, WORD argumentCount, ptr callbackState)")     


请问 arguments 声明为ptr对吗? 不知道是不是这个声明搞错了,下面的代码运行就奔溃


这个代码的目的是绑定一个aar函数给js脚本调用,脚本引擎是ChakraCore完整测试代码如下:
import console;


::ChakraCore = ..raw.loadDll(
"\res\ChakraCore.dll")


var runtime = {ptr value}
var context = {ptr value}
var globalObj = {ptr value}
var funcName = {ptr value}
var func = {ptr value}

// 本地函数
//  typedef _Ret_maybenull_ JsValueRef(CALLBACK * JsNativeFunction)(_In_ JsValueRef callee, _In_ bool isConstructCall, _In_ JsValueRef *arguments, _In_ unsigned short argumentCount, _In_opt_ void *callbackState);
var func_c = ..raw.tocdecl(function(callee, isCtorCall, args, argsCount, callbackState){
    console.log( callee, isCtorCall, args, argsCount, callbackState )
   
   
var ret = {ptr value}
    ::ChakraCore.JsGetNullValue(ret)
   
return ret.value;      
},
"ptr(ptr callee, bool isCtorCall,ptr args, WORD argsCount, ptr callbackState)")      

// 初始化运行环境
::ChakraCore.JsCreateRuntime(0,null, runtime)
::ChakraCore.JsCreateContext(runtime.value, context)
::ChakraCore.JsSetCurrentContext(context.value)


// 获取全局对象
::ChakraCore.JsGetGlobalObject(globalObj)

// 创建函数名
::ChakraCore.JsGetPropertyIdFromNameW( "func", funcName )
// 创建函数
::ChakraCore.JsCreateFunction( func_c, null, func )
// 绑定函数到全局对象
::ChakraCore.JsSetProperty( globalObj.value, funcName.value, func.value, true )

// js代码
var jsCode = //func()

// 运行代码
::ChakraCore.JsRunScriptW(jsCode, 1, "", {ptr value})


console.pause(
true);





回复

使用道具 举报

42

主题

128

帖子

924

积分

荣誉会员

Rank: 8Rank: 8

积分
924
 楼主| 发表于 2018-2-1 16:18:44 | 显示全部楼层
补充个较完整的测试代码


import console;


::ChakraCore = ..raw.loadDll(
"\res\ChakraCore.dll")


var runtime = {ptr value}
var context = {ptr value}
var globalObj = {ptr value}
var funcName = {ptr value}
var func = {ptr value}

// 本地函数
var func_c = ..raw.tocdecl(function(callee, isConstructCall, arguments, argumentCount, callbackState){
    console.log(  callee, isConstructCall, arguments, argumentCount, callbackState )
   
   
// 解析从获取到的参数
    var tArgs = {};
   
var offset = 0
   
for(i=1;argumentCount;1){
        
var v = {ptr value}
        raw.convert(arguments,v, offset );
        offset += raw.sizeof(v)
        
// 假设是数字类型
        var ret = {int value}
        ::ChakraCore.JsNumberToInt(v.value, ret)
        tArgs[ i ] = ret.value
    }
    console.log(
"从js接收的参数", ..table.unpack( tArgs ) )   
   
   
// 定义返回值
    var ret = {ptr value}
    ::ChakraCore.JsGetNullValue(ret)
   
return ret.value;      
},
"ptr(ptr callee, bool isConstructCall,ptr arguments, WORD argumentCount, ptr callbackState)")        

// 初始化运行环境
::ChakraCore.JsCreateRuntime(0,null, runtime)
::ChakraCore.JsCreateContext(runtime.value, context)
::ChakraCore.JsSetCurrentContext(context.value)


// 获取全局对象
::ChakraCore.JsGetGlobalObject(globalObj)

// 创建函数名
::ChakraCore.JsGetPropertyIdFromNameW( "func", funcName )
// 创建函数
::ChakraCore.JsCreateFunction( func_c, null, func )
// 绑定函数到全局对象
::ChakraCore.JsSetProperty( globalObj.value, funcName.value, func.value, true )

// js代码
var jsCode = //func(1,2,3)

// 运行代码
::ChakraCore.JsRunScriptW(jsCode, 1, "", {ptr value})


console.pause(
true);

回复

使用道具 举报

1

主题

25

帖子

428

积分

二级会员

Rank: 3Rank: 3

积分
428
发表于 2018-2-1 17:15:07 | 显示全部楼层
“bool isConstructCall” 应该是 “byte isConstructCall” 吧?
回复

使用道具 举报

42

主题

128

帖子

924

积分

荣誉会员

Rank: 8Rank: 8

积分
924
 楼主| 发表于 2018-2-2 15:16:02 | 显示全部楼层
已解决,是回调函数的调用约定写错了,应为 raw.tostdcall
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-21 22:54 , Processed in 0.093750 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表