无法在Mac应用中加载NPAPI插件

Cha*_*les 7 plugins cocoa gecko webkit npapi

我正在研究一个独立的守护程序可执行文件,它需要在主机上加载现有的第三方NPAPI插件.我想要做的是将生成的视图从插件渲染到纹理/表面.

它需要在Mac和Windows上运行,但由于我是一个沉重的Mac用户,我决定首先构建Mac版本.我们没有这个插件的源代码 - 这是外部供应商提供给我们的东西 - 所以它是一个黑盒实现.

在网络上,该插件的工作方式与flash非常相似.您在链接到某个mimetype(即应用程序/闪存)的网页中嵌入了一个区域,并加载了插件,而插件又会指示插件加载某个文件(想想一个SWF),然后再渲染它.

我现在正在做的是:

1. Open the library (Bundle) and extract NP_Initialize etc.
2. Call NP_Initialize -> returns the object with NPP function pointers etc
3. Call NPP_New (this calls a set of NPP functions) -> ultimately returns NPERR_NO_ERROR. 
Run Code Online (Sandbox Code Playgroud)

由于NPERR_NO_ERROR是预期的响应,我假设这三个步骤已成功完成.

在NPP_New期间,插件请求Cocoa事件模型和Core Animation(或者Core Graphics,如果我为Core Animation返回false)渲染模式.

然后我打电话给:

4. NPP_SetWindow
5. Once the window is set, I load an online file with CURL, and call NPP_NewStream/WriteReady/Write and DestroyStream.
Run Code Online (Sandbox Code Playgroud)

根据我在NPAPI文档中可以找到的内容,NewStream/WriteStream/etc函数基本上将文件加载到插件的内存中,因此可以呈现它.

该插件在浏览器中支持Core Animation和Core Graphics,并且在支持NPAPI插件的浏览器中运行良好.

完成上述所有操作后,我尝试渲染到纹理,但在Core Graphics模式下,我继续使用CGContextRef从NPP_Event函数调用返回错误响应.在Core Animation模式下运行时,我使用renderInContext将纹理渲染到位图,但整个图像保持空白/透明.

这是一个很长的镜头,但有没有人有任何想法?

Gil*_* AB 2

如果您确实在不同的线程中尝试代码(如果是这种情况),我假设您不使用此 UI 线程。然而,它可以与很多事情相关,从图像本身开始(因为它是空的/透明的),这就是我使用的:

UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); //after this you should see the image
Run Code Online (Sandbox Code Playgroud)

以下评论与Mozilla CoreAnimationDrawingModel 插件相关

(你的黑盒插件可能是基于它的?)

确保您使用 Flash 10.1+,因为该版本之前不支持 Core Animation 绘图模型(您加载了 SWF)。

笔记!如果您的黑盒插件使用 QTMovieLayer 进行渲染,它应该会失败,因为 renderInContext 不支持它。

关于您的主题的其他有趣读物(2010 年起):核心动画