- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在外部 JavaScript 文件 sample.js 中用 JavaScript 编写了一个函数。
function fileInfo(obj)
{
/////
}
class sample
{
int i;
///
};
///
int main()
{
sample obj;
///
///
}
最佳答案
您不能将用一种编程语言编码的对象直接传递给用另一种编程语言编写的另一个程序。这是不可能的,因为对象的二进制布局因一种编程语言而异。例如,在 JavaScript 中,数字类型是 64 位浮点数(8 字节)。如果您的 C++ 对象使用 int32(4 个字节),则两个对象在内存中的布局不同。两个对象至少应该具有相同的大小(8 字节)才能兼容(实际上它比这要复杂得多)。总之,为了在不同的编程语言之间交换值,您需要以中性格式达成一致或在数据类型之间进行转换。
用于 C/CCP/Objective-C 等的 FFI(外部函数接口(interface))JavaScript 库允许您保持 C 和 JavaScript 程序之间的 ABI 兼容性。如果您需要混合 C/CPP 和 JavaScript 代码,您可以使用 javascriptcoregtk
图书馆。
回到你的例子,你需要转换你的 Sample
CPP 反对 JSCValue
对象使其工作。由于我在第一段中评论过的原因,强制转换是不够的(程序员需要决定 CPP 对象与其在 JavaScript 中的等效对象之间的转换应该是什么样子)。这是一个可能的解决方案:
/**
* Pass CPP object to JavaScript function
*
* sample.js:
* function fileInfo(obj)
* {
* return "fileInfo: " + obj.i;
* }
*
* To compile: g++ main.cc -o main `pkg-config --cflags --libs javascriptcoregtk-4.0`
*
*/
#include <iostream>
#include <string>
#include <fstream>
#include <streambuf>
#include <jsc/jsc.h>
using namespace std;
class Sample {
public:
Sample(int i) { this->i = i; };
JSCValue* toJSObject(JSCContext* jsContext);
int i;
};
JSCValue* Sample::toJSObject(JSCContext* jsContext)
{
JSCValue* ret = jsc_value_new_object(jsContext, nullptr, nullptr);
JSCValue* i = jsc_value_new_number(jsContext, this->i);
jsc_value_object_define_property_data(ret, "i", JSC_VALUE_PROPERTY_ENUMERABLE, i);
return ret;
}
int main(int argc, char* argv[])
{
// Create jsContext.
JSCContext* jsContext = jsc_context_new();
// Load JavaScript file.
const std::string filename = {"sample.js"};
ifstream t("sample.js");
string code((std::istreambuf_iterator<char>(t)),
std::istreambuf_iterator<char>());
JSCValue* ret = jsc_context_evaluate(jsContext, code.c_str(), static_cast<gssize>(code.length()));
// Query 'fileInfo' and store it into JSCValue.
JSCValue* fileInfo = jsc_context_evaluate(jsContext, "fileInfo", 8);
if (!jsc_value_is_function(fileInfo)) {
cerr << "Couldn't find function 'fileInfo'" << endl;
exit(EXIT_FAILURE);
}
// Create CPP object.
Sample obj(42);
// Convert to JSCValue object and call 'fileInfo' function.
ret = jsc_value_function_call(fileInfo, JSC_TYPE_VALUE, obj.toJSObject(jsContext), G_TYPE_NONE);
cout << "ret: [" << jsc_value_to_string(ret) << "]" << endl;
return 0;
}
Sample::toJSObject
将您的 CPP 对象转换为 JSCValue 对象。然后函数调用
jsc_value_function_call(fileInfo, JSC_TYPE_VALUE, obj.toJSObject(jsContext), G_TYPE_NONE);
执行函数
fileInfo
(之前在此 JavaScript 上下文中加载)并传递 CPP 对象的“强制转换”版本。执行此程序后的结果是:
ret: [fileInfo: 42]
关于javascript - 如何使用 JavaScriptCore 将 C++ 对象传递给 JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57003419/
所以我想了解 JavascriptCore 的工作原理。 所以首先我尝试调用单个函数,但现在我尝试调用类中的函数。 我的 javascript 代码是这样的 var sayHelloAlfred =
我正在尝试从 swift 类的单例实例中调用方法。 这是我的协议(protocol): @objc public protocol MyProtocol: JSExport { var nam
我正在考虑在应用程序中嵌入 JavaScriptCore。我很好奇它的便携性如何?理想情况下,我希望它能够在 Linux、Windows 和 OSX 以及 Android 和 iOS 上运行。自然 O
我正在尝试使用 iOS 应用程序连接到 Node.JS 服务器,但我没有使用第 3 方 native 库,而是尝试将其与 JavaScript Socket.IO 客户端连接并传递数据我正在接收我的
我有一个使用 JavaScriptCore 的 UIWebView。我正在尝试从网页调用 ObjC 函数。但是,该函数需要异步调用,因此我传入了一个在调用异步 ObjC 函数时调用的回调函数。 我的理
考虑以下带有 NSObject * 属性的 JSExported objective-c 类: @protocol MyObjectExport @property (nonatomic, stro
我在使用 JavaScriptCore 时遇到了一些奇怪的问题。每当我向我的类添加一个带有参数的方法时,它似乎都没有被导出(或者以一个奇怪的名称导出)。例如: import Cocoa import
我整理了一个非常简单的程序,它使用 JavaScriptCore 来评估 JS: #import #import int main(int argc, const char * argv[]) {
我想在 JavascriptCore 上下文中定义一个函数,该函数采用可变数量的参数。 类似这样的事情: JSVirtualMachine* virtualMachine = [[JSVirtualM
我在 React Native 中遇到了一个复杂的竞争条件问题。在编译时发出警告是否会显着影响 javascript 包的初始化时间? javascript 包是一个 130,000 行的文件,我怀疑
JavaScriptCore 框架如何将 JavaScript 对象转换为 Objective-C 对象,反之亦然?桥接器是否使用相同的二进制协议(protocol)来对两种目标语言进行通信? 最佳答
JavaScriptCore 框架如何将 JavaScript 对象转换为 Objective-C 对象,反之亦然?桥接器是否使用相同的二进制协议(protocol)来对两种目标语言进行通信? 最佳答
我在我们的应用程序上添加了一个 webview 实例。但是,有时会发生崩溃。 调用堆栈上的崩溃称为 JavaScriptCore WTFCrash。 Crashed: com.apple.main-t
在终端上运行 jsc 命令时,我可以访问函数 print()。它只是记录到标准输出。 我正在构建一个框架,以使 JS 库可以用 C 语言使用,当我的 JS 源尝试调用 print() 时,会引发异常。
JSC seems like the simpler-and-easier ,更便携,和准通用安装 - 世界上 node.js 的明显替代品......我已经能够弄清楚基础知识,但几乎没有关于它的东西
我有一个由 javascript 使用 JavascriptCore 调用的函数。现在,在该函数内,我必须在特定条件下再次评估 javascript。这应该调用相同的函数。 let My_JS_Fun
我正在尝试为 iOS 使用 JavascriptCore 框架,但我遇到了问题。 我的简单 javascript 文本: NSString * jsCode = @"var log = require
我正在开发一个 js 库,它也应该可以被 react-native 项目使用。 react-native 使用的 javascript 引擎是 JavaScriptCore,它与浏览器中使用的 nod
https://github.com/gg2001/monero/blob/master/monero/NewWallet.js 我有一个相当大的 6000 行 js 文件,JavaScript 核心
我正在尝试使用 JavaScriptCore C API 开发一个简单的 cli 工具示例(在我的 linux 机器上使用,或者如果不可能在 mac osx 上使用它)。参数是 JavaScript
我是一名优秀的程序员,十分优秀!