热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

最近在研究Android上浏览器插件..资料比较少..基本都是从研究NPAPI开始的..那么我也从这开始吧由于这篇文章是边做实验边记录,加上本身对VS不太了解,可能有些地方不对,

 


最近在研究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 , 就可以看到这个插件了。

 

 

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

 

 

最后附上测试网页代码:

 

 

 

 

参考文献(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

 


推荐阅读
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • Parallels Desktop for Mac 是一款功能强大的虚拟化软件,能够在不重启的情况下实现在同一台电脑上无缝切换和使用 Windows 和 macOS 系统中的各种应用程序。该软件不仅提供了高效稳定的性能,还支持多种高级功能,如拖放文件、共享剪贴板等,极大地提升了用户的生产力和使用体验。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
  • 本文探讨了如何通过检测浏览器类型来动态加载特定的npm包,从而优化前端性能。具体而言,仅在用户使用Edge浏览器时加载相关包,以提升页面加载速度和整体用户体验。此外,文章还介绍了实现这一目标的技术细节和最佳实践,包括使用User-Agent字符串进行浏览器识别、条件加载策略以及性能监控方法。 ... [详细]
  • 二叉树的直径是指树中任意两个叶节点之间最长路径上的节点数量。本文深入解析了计算二叉树直径的算法,并提出了一种优化方法,以提高计算效率和准确性。通过详细的案例分析和性能对比,展示了该优化算法在实际应用中的优势。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 尽管存在唯一列,仍显示“当前选择不包含唯一列。网格编辑、复选框、编辑、复制和删除功能不可用”的消息。 ... [详细]
  • 探讨 `org.openide.windows.TopComponent.componentOpened()` 方法的应用及其代码实例分析 ... [详细]
author-avatar
哒Dayling玲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有