如何使用iOS上的JavaScriptCore创建从JavaScript调用的C 回调
How do I create a C++ callback invoked from JavaScript using JavaScriptCore on iOS?
我正在使用JavaScript Core来促进我正在进行的iOS项目C 和JavaScript之间的通信。以下工作可从C 调用JavaScript函数:
#include <JavaScriptCore/JavaScriptCore.h>
void myCPPFunction()
{
JSGlobalContextRef globalContext =
JSGlobalContextCreateInGroup(JSContextGroupCreate(), nullptr);
auto funcOutput = JSEvaluateScript(globalContext,
JSStringCreateWithUTF8CString(("function test() {
return 'hi'; } test();", nullptr, nullptr, 1, nullptr);
// funcOutput now contains a JSValue containing the
// return value of the function ('hi').
}
现在,我想从JavaScript调用C 功能。例如,如果我的C 函数定义如下:
double myCPPCallback(unsigned long x)
{
// do stuff
}
如何从我使用JSEvaluateScript
运行的JavaScript调用此C 代码?
最容易与jsobjectMakeFunction在callback上完成您可以为您声明的jsobjectCallasFunctionCallback提供的内容,然后调用您的C 函数。然后,您可以用JavaScript代码以JSobjectMakeFunction WithCallback中的名称来调用回调。
。还要注意,您也许不应该使用...
之类的东西JSGlobalContextRef globalContext =
JSGlobalContextCreateInGroup(JSContextGroupCreate(), nullptr);
...因为这样您泄漏了组(JSContextGroupCreate()
的结果)。我尝试制作示例OSX代码(没有时间测试):
#include <iostream>
#include <JavaScriptCore/JavaScriptCore.h>
JSValueRef HelloCallback( JSContextRef ctx
, JSObjectRef function
, JSObjectRef thisObject
, size_t argumentCount
, const JSValueRef arguments[]
, JSValueRef* exception)
{
// here do the C++ stuff
std::cout << "Hello World" << std::endl;
return JSValueMakeUndefined(ctx);
}
int main(int argc, const char * argv[])
{
// bad raw opaque pointers TODO: manage with smart pointers
JSContextGroupRef group = JSContextGroupCreate();
JSGlobalContextRef globalContext = JSGlobalContextCreateInGroup(group, nullptr);
JSObjectRef globalObject = JSContextGetGlobalObject(globalContext);
JSStringRef helloFunctionName = JSStringCreateWithUTF8CString("hello");
// make function object
JSObjectRef functionObject = JSObjectMakeFunctionWithCallback( globalContext
, helloFunctionName
, &HelloCallback);
// set it as proprty of global object
JSObjectSetProperty( globalContext
, globalObject
, helloFunctionName
, functionObject
, kJSPropertyAttributeNone
, nullptr );
// make javascript
JSStringRef statement = JSStringCreateWithUTF8CString("hello()");
// evaluate it
JSEvaluateScript( globalContext
, statement
, nullptr
, nullptr
, 1
, nullptr );
// manual raw pointer management ... hopefully did not forget any
JSGlobalContextRelease(globalContext);
JSContextGroupRelease(group);
JSStringRelease(helloFunctionName);
JSStringRelease(statement);
return 0;
}
相关文章:
- 如何使用EM_JS从带有参数的C++调用javascript方法
- 如何在 C++ 中从 V8 调用 Javascript 函数
- 从C++代码抛出错误调用 JavaScript 回调函数 - nbind
- node.js Nan:在函数C++调用 JavaScript 回调
- 如何使用 cocos creator 在 Cocos2d-X/Cocos2d-JS 中调用 javascript 函数并
- v8.从 C++ 保存和调用 JavaScript 函数
- 在WindBG断点命令中调用JavaScript函数
- 在V8中从C++回调调用Javascript函数
- 从QT调用JavaScript函数,并未显示输出
- 使用node.js从C++调用JavaScript
- 如何使用 WebKit 调用 JavaScript 中的C++函数
- NodeJS Addon从NAN AsyncWorker::Execute内部调用Javascript回调
- 使用 Emscripten 异步调用 JavaScript C++函数
- 从 C++ 节点调用 JavaScript 函数.js扩展
- ActiveX 调用 Javascript 函数
- 从C++调用javascript函数
- 通过c++调用javascript推送服务
- 如何使用V8从C++访问和调用Javascript对象属性和方法
- 如何在QWebengine中调用Javascript中的c++ /Qt函数
- v8,libuv,nodejs,win32api-如何调用EnumWindows并具有回调调用javascript函数