【Android浏览器插件开发准备工作之NPAPI】使用Visual Studio 2008 运行Firefox浏览器插件实例npruntime

晨曦之光 发布于 2012/03/01 19:59
阅读 1K+
收藏 0

 


最近在研究Android上浏览器插件.. 资料比较少.. 基本都是从研究NPAPI开始的.. 那么我也从这开始吧...

 

由于这篇文章是边做实验边记录, 加上本身对VS不太了解, 可能有些地方不对, 欢迎大家指正!!

 

 


 

npruntime 

参照下述步骤一步一步来:

Build

1.  Create a new project in Visual Studio for a Win32 GUI library (DLL) (in .NET 2003: Win32 template, then switch to DLL in Application Settings in the following dialog, export symbols too?)(in Visual Studio 2008, it isVisualc++|Win32|Win32 Project, then check DLL in the wizard).

2.  If a wizard gives you a checkbox to create an empty project, then check it. Otherwise you'll delete files later.

3.  Again note that the resulting DLL filename must start with "np", so either call your project like this or rename the file later

4. Delete the .cpp and .h and ReadMe files from the project and disk (if you did not create an empty project)

5. Copy the npruntime sample plugin source code into the dir of the new VS project and add the files to the project using the VS GUI (.cpp files to "Source Files", .h files to "Header Files", .rc file to "Resource Files"). Samples can be obtained from: https://developer.mozilla.org/en/Plugins/Samples_and_Test_Cases

6. Download the Gecko SDK (aka XULRunner SDK) from mozilla.org release FTP and extract it. You can download it from here: http://developer.mozilla.org/en/docs/Gecko_SDK

7. Add the Gecko SDK include path (example : C:/xulrunner-sdk/sdk/include) to Project Properties|(all configurations)|C++|General|Additional Include Directories. Note: If your project is still empty, the C++ tree might not be visible. So, add some files first.

8. Add the following preprocessor definitions to Project Properties|(all configurations)|C++|Preprocessor|Preprocessor Definitions:WIN32;_WINDOWS;XP_WIN32;MOZILLA_STRICT_API;XPCOM_GLUE;XP_WIN;_X86_;NPSIMPLE_EXPORTS

9.Disable precompiled headers using Project Properties|(all configurations)|C++|Precompiled headers|Create/Use precompiled header. They may be already disabled.

10. Define the function exports by adding the .def filename (e.g. nprt.def) to Project Properties|(all configurations)|Linker|Input|Module Definition File. It could be either the full path or the path relative to the project directory.

11. Optional: Open the above .def file and change "NPRT" to the filename of your dll as VS sees it (without "np", if you decided to rename later)

12. Optional: Edit the .rc file and and the top of npp_gate.cpp for the description, mimetype, file extension etc. to reflect your plugin

13. Remove the function NPP_GetJavaClass from npp_gate.cpp

14. Build

15. Rename the resulting DLL so that the filename starts with "np" and ends with ".dll" (or "32.dll"? 8.3?) and copy it in Mozilla's "plugins" folder

16. Start Mozilla and open about:plugins to verify the plugin is detected

17. Open the file "test.html" and begin testing. Make sure the mimetypes of your html embed tags match the mimetype specified in your nprt.rc file and the top of your npp_gate.cpp file

第一步:

第二步:

(因为选择的空项目,第三、第四步省略)

第五步:导入源码

npruntime 源码结构:

下载地址:  http://mxr.mozilla.org/seamonkey/source/modules/plugin/samples/npruntime/ 


重要:

调查到最后发现, 上面不知道是对应什么版本的。与我下载的SDK 1.9.2 不匹配。 所以在下载npruntime源代码的时候,同时注意选择SDK的版本。

对应Geoc SDK1.9.2 npruntime源码位置:

http://mxr.mozilla.org/mozilla1.9.2/source/modules/plugin/sdk/samples/npruntime/


Moliza 1.9.2 版本的npruntime源码结构: (结构是一样的,关键里面代码不一样。郁闷死我了!)


导入后的项目目录结构:

 

其中resource.h 和 npxx1.rc 和源码中的可能有点不一样的。

resource.h是创建npxx1.rc后自动产生的。

 

第六步 & 第七步:

给项目配置Gecko SDK include path (example : C:/xulrunner-sdk/sdk/include) 

配置方法: Project Properties|(all configurations)|C++|General|Additional Include Directories

注意: 如果项目还是空的,那么就无法看到C++这个选项,所以先加几个文件吧。

 

空项目时的 Project Properties:

 

追加完Source文件后的Project Properties:

 

追加路径的窗口:

 

 

第八步:

添加预处理器定义, 把你没有的添加进去即可!


 

第九步:

不使用预编译头。 (一般默认就是不使用了)

 

第十步:模块定义文件配置

Npruntime中有个def文件,之前没有用,现在派上用场了。 我把它暂时放在了E盘。 使用绝对路径来配置。


 

第十一步: 编辑上面的def文件, 重命名DLL.

 

注意,这边的library名字最好要和resoiurce文件一样! 这边我懒得重新截图了!

 

第十二步: 修改.rc文件和 npp_gate.cpp 文件 (description, mimetype, file extension)

第十三步: npp_gate.cpp 文件删除 NPP_GetJavaClass 方法

第十四步: 编译

第十五步:重命名DLL,一定要以np开头,以.dll结尾

 

 

最后附上注意事项,编译时如果有错,也请看下面的介绍:

Version Issues

1. If you are using Gecko SDK v1.9 and higher, you'll probably need to add folders /plugin, /nspr, and /java as included directories (as seen above, go to Project Properties|(all configurations)|C++|General|Additional Include Directories). These directories are contained in the Gecko SDK include path that you previously added.

2. If VC++ compiler throws you error C2664 on 'DrawText' function call, you may replace it by 'DrawTextA'. In fact, all win32 API functions dealing with character strings can be added an 'A' to the end to avoid unicode cast errors.

3. Visual C++ 2008 Express don't support C99 standard about int32_t, uint32_t. You have to add #include "nptypes.h" in top of plugin.h file. For xulrunner 1.9.0.1 SDK, npapi.h file uses int32, uint32 which is different from int32_t, uint32_t defined in nptypes.h, and it may cause problems in link stage.

4. For xulrunner 1.9.0.1 SDK, you may not find npfunctions.h in include directories. You have to replace all npfunctions.h by npnpp.h in #include line.

5. Feel free to append here your issues fixes if the above guide helped you.

 

第二条: SDK1.9.2版本编译时遇到了。

 

第三条补充:

       xulrunner 1.9.0.1 SDK以上, nptypes.h 中定义的都是int32_t, uint32_t这样,而不是int32, uint32  所以npruntime代码中需要相应的修改。

    (如果下载的源码与SDK的版本相对应,应该不存在这个问题)


第五条补充:

    xulrunner 1.9.0.1 SDK中不存在npfunctions.h,但是在xulrunner 1.9.2 SDK 中又包含了该文件, 反而没有npnpp.h

 

总结:(造成打开资源文件时RC1004错误,编译时会造成Error PRJ002等错误,花了我不少时间)

拷贝npruntime这一步非常重要,我直接Ctrl+c Ctrl+v来拷贝,最后发现错误一堆。

所以自己一个一个创建文件吧,然后把代码贴过去。


另外里面的资源文件nprt.rc 最好要跟你的项目名相同。千万注意这边不是单纯的把这个源文件拷贝过去。

另外resource.h会由VS2008自动生成,不需要你修改(也不要去拷贝源码中的文件)。

 

 


 

好了,到此所有操作都结束了,运行后会得到一个dll文件。 我这边resource文件名为npxx.rc 在def文件中配置的library名也是npxx, 所以我得到的是 npxx.dll ..  (这两句话感觉好二...)

 

把这个dll文件拷贝到Firefox的安装目录下的plugins目录下即可。

 

安装完后,在Firefox的地址栏中输入: about:plugins , 就可以看到这个插件了。

 

 

下面打开测试网页, 就可以看到效果了。

 

 

最后附上测试网页代码:

<HTML>
 <HEAD>
 <TITLE>Scriptable Plug-in Test</TITLE>
 </HEAD>
<BODY id="bodyId">
 
 <center>
 <h1>Sample Scriptable Plug-in </h1>
 </center>
 
 This page contains a testcase which demonstrates the work of
 scriptable 4.x style Navigator plug-in with Mozilla. The example
 plug-in occupies the area right below this text, and you should see a
 frame the plug-in draws around its window. Below the plug-in window
 there are two buttons. Clicking on the buttons will result in calling
 native plugin methods from JavaScript. Show Version will instruct the
 plug-in to retrieve the Mozilla user agent string and display it in
 the plug-in window, Clear button will call plug-in method to erase the
 window.
 
 <br><br>
 
 <center>
 
 <mce:script type="text/javascript"><!--
 function bar(arg)
 {
   document.getElementById("result").innerHTML += "<p>" + "function bar(" + arg + ") called!" + "</p>";
 
   return 4;
 }
 
// --></mce:script>
 
 <div id="result">
 <p>results go here:</p>
 </div>
 
 <embed id="embed1" type="application/mozilla-npruntime-scriptable-plugin" width=600 height=40><br>
 
 <embed type="application/x-java-mozilla-npruntime-scriptable-plugin" style="display: block; width: 50%; height: 100px;"><br>
 
 <mce:script type="text/javascript"><!--
 var embed1 = document.getElementById('embed1');
 
// --></mce:script>
 
 <br>
 <form name="formname">
 <input type=button value="Call pluginobj.foo()" onclick='alert(pluginobj.foo())'>
 <input type=button value="alert(pluginobj.bar)" onclick='alert(pluginobj.bar)'>
 <input type=button value="alert(pluginobj('foo'))" onclick='alert(pluginobj("foo"))'>
 <br>
 <input type=button value="alert(embed1.bar)" onclick='alert(embed1.bar)'>
 <input type=button value="alert(embed1.foo())" onclick='alert(embed1.foo())'>
 <input type=button value="alert(embed1())" onclick='alert(embed1())'>
 <input type=button value="embed1.bar='foo'" onclick='embed1.bar="foo";'>
 </form>
 
 </center>
 
 </BODY>
 </HTML>
 

 

 

 

参考文献(Mozila官方文档)

http://code.google.com/chrome/extensions/npapi.html

https://developer.mozilla.org/en/Plugins

https://developer.mozilla.org/en/Gecko_Plugin_API_Reference

https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Preface#The Plug-in software development kit

 

个人博客:

http://blog.csdn.net/qyqzj/archive/2010/06/14/5670816.aspx

http://blog.csdn.net/qyqzj/archive/2010/07/04/5712151.aspx

http://www.blogjava.net/anymobile/articles/328592.html?opt=admin

http://blog.csdn.net/qyqzj/archive/2010/05/30/5634532.aspx

http://blog.csdn.net/qyqzj/archive/2010/08/03/5786313.aspx

http://blog.sina.com.cn/s/blog_6d1656130100ml5t.html

 

NPAPI帮助理解:

http://blog.csdn.net/hanyuxinting/archive/2010/10/28/5972428.aspx

http://blog.csdn.net/hanyuxinting/archive/2010/10/29/5973630.aspx

http://blog.csdn.net/hanyuxinting/archive/2010/12/10/6068384.aspx

http://blog.csdn.net/vinilarain/archive/2010/03/03/5343170.aspx

 


原文链接:http://blog.csdn.net/feng88724/article/details/6408323
加载中
返回顶部
顶部