最近在研究Android上浏览器插件.. 资料比较少.. 基本都是从研究NPAPI开始的.. 那么我也从这开始吧...
由于这篇文章是边做实验边记录, 加上本身对VS不太了解, 可能有些地方不对, 欢迎大家指正!!
npruntime
参照下述步骤一步一步来:
<!--[if !supportLists]-->1.Create a new project in Visual Studio for aWin32 GUI library(DLL) (in .NET 2003:Win32template, then switch toDLLinApplication Settingsin the following dialog, export symbols too?)(in Visual Studio 2008, it isVisualc++|Win32|Win32 Project, then checkDLLin the wizard).
<!--[if !supportLists]-->2.If a wizard gives you a checkbox to create anempty project, then check it. Otherwise you'll delete files later.
<!--[if !supportLists]-->3.Again note that the resulting DLL filename must start with "np", so either call your project like this or rename the file later
<!--[if !supportLists]-->4.Delete the.cppand.handReadMefiles from the project and disk (if you did not create an empty project)
<!--[if !supportLists]-->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 (.cppfiles to "Source Files",.hfiles to "Header Files",.rcfile to "Resource Files"). Samples can be obtained from:https://developer.mozilla.org/en/Plugins/Samples_and_Test_Cases
<!--[if !supportLists]-->6.Download theGecko 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
<!--[if !supportLists]-->7.Add theGecko SDK include path(example: C:/xulrunner-sdk/sdk/include) toProject 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.
<!--[if !supportLists]-->8.Add the following preprocessor definitions toProject Properties|(all configurations)|C++|Preprocessor|Preprocessor Definitions:WIN32;_WINDOWS;XP_WIN32;MOZILLA_STRICT_API;XPCOM_GLUE;XP_WIN;_X86_;NPSIMPLE_EXPORTS
<!--[if !supportLists]-->9.Disable precompiled headers usingProject Properties|(all configurations)|C++|Precompiled headers|Create/Use precompiled header. They may be already disabled.
<!--[if !supportLists]-->10.Define the function exports by adding the.deffilename (e.g. nprt.def) toProject Properties|(all configurations)|Linker|Input|Module Definition File. It could be either the full path or the path relative to the project directory.
<!--[if !supportLists]-->11.Optional: Open the above.deffile and change "NPRT" to the filename of your dll as VS sees it (without "np", if you decided to rename later)
<!--[if !supportLists]-->12.Optional: Edit the.rcfile and and the top ofnpp_gate.cppfor the description, mimetype, file extension etc. to reflect your plugin
<!--[if !supportLists]-->13.Remove the functionNPP_GetJavaClass
fromnpp_gate.cpp
<!--[if !supportLists]-->14.Build
<!--[if !supportLists]-->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
<!--[if !supportLists]-->16.Start Mozilla and openabout:pluginsto verify the plugin is detected
<!--[if !supportLists]-->17.Open the file "test.html" and begin testing. Make sure the mimetypes of your html embed tags match the mimetype specified in yournprt.rcfile and the top of yournpp_gate.cppfile
第一步:
第二步:
(因为选择的空项目,第三、第四步省略)
第五步:导入源码
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/
<!--[endif]-->
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++这个选项,所以先加几个文件吧。
空项目时的ProjectProperties:
追加完Source文件后的ProjectProperties:
追加路径的窗口:
第八步:
添加预处理器定义, 把你没有的添加进去即可!
第九步:
不使用预编译头。 (一般默认就是不使用了)
第十步:模块定义文件配置
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
<!--[if !supportLists]-->1.If you are using Gecko SDK v1.9 and higher, you'll probably need to add folders/plugin,/nspr, and/javaas included directories (as seen above, go toProject Properties|(all configurations)|C++|General|Additional Include Directories). These directories are contained in the Gecko SDK include path that you previously added.
<!--[if !supportLists]-->2.If VC++ compiler throws youerror C2664on '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.
<!--[if !supportLists]-->3.Visual C++ 2008 Express don't support C99 standard aboutint32_t,uint32_t. You have to add#include "nptypes.h"in top ofplugin.hfile. Forxulrunner 1.9.0.1 SDK, npapi.h file usesint32,uint32which is different fromint32_t,uint32_tdefined innptypes.h, and it may cause problems in link stage.
<!--[if !supportLists]-->4.Forxulrunner 1.9.0.1 SDK, you may not findnpfunctions.hin include directories. You have to replace allnpfunctions.hbynpnpp.hin#includeline.
<!--[if !supportLists]-->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 , 就可以看到这个插件了。
下面打开测试网页, 就可以看到效果了。
最后附上测试网页代码:
参考文献(Mozila官方文档):
http://code.google.com/chrome/extensions/npapi.html
https://developer.mozilla.org/en/Plugins
https://developer.mozilla.org/en/Gecko_Plugin_API_Reference
个人博客:
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