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

               


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

 

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

 

 


npruntime 

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

Build

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

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

3.  Again note that the resultingDLL 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 (ifyou did not create an empty project)

5. Copy the npruntime sampleplugin source code into the dir of the new VS project and add the files to theproject 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 GeckoSDK (akaXULRunner SDK) from mozilla.org release FTP and extract it. You can download itfrom here: http://developer.mozilla.org/en/docs/Gecko_SDK

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

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

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

10. Define the function exports byadding the .def filename (e.g. nprt.def) to ProjectProperties|(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" tothe filename of your dll as VS sees it (without "np", if you decidedto rename later)

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

13. Remove the function NPP_GetJavaClass from npp_gate.cpp

14. Build

15. Rename the resulting DLL sothat the filename starts with "np"and ends with ".dll" (or "32.dll"? 8.3?) and copy it inMozilla'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 htmlembed 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后自动产生的。

 

第六步 & 第七步:

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

配置方法: Project Properties|(allconfigurations)|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结尾

 

 

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

VersionIssues

1. If youare 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|(allconfigurations)|C++|General|Additional Include Directories). These directories are contained in the Gecko SDKinclude 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 stringscan be added an 'A' to the end to avoid unicode cast errors.

3. VisualC++ 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 freeto 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错误,编译时会造成ErrorPRJ002等错误,花了我不少时间)

拷贝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()" οnclick='alert(pluginobj.foo())'> <input type=button value="alert(pluginobj.bar)" οnclick='alert(pluginobj.bar)'> <input type=button value="alert(pluginobj('foo'))" οnclick='alert(pluginobj("foo"))'> <br> <input type=button value="alert(embed1.bar)" οnclick='alert(embed1.bar)'> <input type=button value="alert(embed1.foo())" οnclick='alert(embed1.foo())'> <input type=button value="alert(embed1())" οnclick='alert(embed1())'> <input type=button value="embed1.bar='foo'" οnclick='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#ThePlug-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

           

猜你喜欢

转载自blog.csdn.net/qq_44912644/article/details/89500230
今日推荐