nodejs addon binding osg

绑定过webpage 到osg 窗口,我需要一个回调机制对osg 显示进行后台显示. 具体的做法是osg作为一个状态机, 前台web界面向后台发送命令, 消息 .

后台接收消息,改变状态.我想架在soket上. 我需要一个网络的服务的状态机.nodejs 正好短小精悍.相对开发比较火热.并且前后台保持开发语言的一致.

避免了,开发者在不同语言下切换.v8引擎有全球上亿的人口在做测试.想来也不用忧虑.


以上是绑定js的目的.

在网上搜寻js的资料发现都是2010年的一篇,那时node.js 才0.02版. node.js 社区对其进行修改使用一个叫node-gyp的集成工具进行addon的开发.

具体请见 node.js addon

> 下载node-js 执行vcbuild.bat 批处理文件编译node-js

> 下载addon的例子, 执行node-gyp 变异node.js C++拓展.

第二点具体的执行是出现一些状况, 

> 直接按照默认的流程执行,最后出现的版本是x64位的. 使用node.js执行js脚本,启动addon回弹出一个异常,大概的意思是讲,你的dll是x64位的,而你的

node.exe 是win32 的不匹配. 这个问题困扰了我很久,我尝试了node-gyp 构建工具的命令, 详细的观察输出信息.但是一直不得要领. 在google中搜寻资料

关于node-gyp 构建的命令很少.官方的文档更是精简,只要按照默认的configure->build .  尝试很久msvs 中的工厂选项一直只是显示x64 版本,并且只有

Release本的工程师配置完全的,可以编译通过. 在屡屡受挫的情况下.我甚至尝试要重新编译x64版本的地node.js 但是因为我不能得到Debug版本的addon

所以暂时没有考虑这种方式。随后了解到node-gyp是gyp的延伸。node-gyp的命令应该和gyp的命令是有共同点。所以尝试google搜寻 gyp build win32 的

信息,但是还是很少。最后在一篇问答上看到有这样一行命令

--arch  ia32  

尝试了下

node-gyp configure -arch ia32  竟然可以产生 win32 的版本。但是根据build时输出的信息,仍旧是Release版本 。 有关node.exe 加载 example addon OK

终于出现久违的hello 了。

再接再厉, 尝试  --mode debug  不行

--Debug  竟然可以。 具体的command

node-gyp configure -arch ia32  --debug

 


总是这个addon的绑定流程算是跑通。接下来就是osg 的暴力绑定了。我直接在addjs 加入下列代码。 

Handle<Value> Method(const Arguments& args) {
  HandleScope scope;

  osgViewer::Viewer viewer;

  osg::Group *root = new osg::Group();

  osg::Box *unitCube = new osg::Box( osg::Vec3(0,0,0), 1.0f );
  unitCube->setDataVariance(osg::Object::DYNAMIC);

  osg::ShapeDrawable *unitCubeDrawable = new osg::ShapeDrawable(unitCube);

  osg::Geode *basicShapeGeode = new osg::Geode;

  basicShapeGeode->addDrawable( unitCubeDrawable );

  root->addChild( basicShapeGeode );

  viewer.setSceneData( root );
  viewer.setCameraManipulator( new osgGA::TrackballManipulator() );
  viewer.realize();

  //viewer.setUpViewInWindow( 20, 20, 640, 480 );

  while ( !viewer.done() ) {
	  viewer.frame();
  }

  return scope.Close(String::New("world"));
}


这个是osg sample中的独有例子,渲染界面全屏显示。 

当我设置osg 的窗口大小。会出现

Error: [Screen #0] GraphicsWindowWin32::makeCurrentImplementation() -
Window not
realized; cannot do makeCurrent.

的error  

http://comments.gmane.org/gmane.comp.graphics.openscenegraph.user/12009 与链接中的描述一致。


这个问答中的讲 是因为线程的原因, 本人表示不懂。但是隐隐约约觉得 node.js 本身有一个基于事件的libuv框架。

不过当mark掉也没有人很问题。所以不提。


这是对node.js 的初接触吧









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Node.js的Addon可以方便地加载和调用DLL(动态链接库)。 首先,我们需要创建一个C++的Addon模块。在该模块中,我们可以使用`LoadLibrary`函数加载DLL,并使用`GetProcAddress`函数获取DLL中定义的函数指针。 下面是一个示例代码: ```cpp #include <node.h> // 声明DLL函数指针类型 typedef int (*MY_FUNCTION)(int); // 在Addon模块中导出的函数 void CallDLLFunction(const v8::FunctionCallbackInfo<v8::Value>& args) { // 加载DLL HMODULE hModule = LoadLibrary("path/to/dll"); if (hModule) { // 获取DLL中的函数指针 MY_FUNCTION myFunction = (MY_FUNCTION)GetProcAddress(hModule, "FunctionName"); if (myFunction) { // 调用DLL函数 int result = myFunction(10); // 返回结果 args.GetReturnValue().Set(result); } else { // 获取函数指针失败 args.GetReturnValue().Set(-1); } // 卸载DLL FreeLibrary(hModule); } else { // 加载DLL失败 args.GetReturnValue().Set(-1); } } // 注册Addon模块 void Initialize(v8::Local<v8::Object> exports) { NODE_SET_METHOD(exports, "callDLLFunction", CallDLLFunction); } NODE_MODULE(addon, Initialize) ``` 在Node.js中,我们可以使用Addon模块中导出的`callDLLFunction`函数来调用DLL。 ```javascript const addon = require('./addon'); // 调用DLL函数 const result = addon.callDLLFunction(); console.log(result); ``` 需要确保将DLL所在的路径替换为`LoadLibrary`函数中的实际路径,并将`GetProcAddress`函数中的`FunctionName`替换为DLL中实际的函数名。 通过这种方式,我们可以利用Node.js的Addon功能方便地加载和调用DLL,从而扩展Node.js的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值