<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>CIOを目指しつつの8makiのアレ &#187; NPAPI</title>
	<atom:link href="http://blog.8maki.jp/tag/npapi/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.8maki.jp</link>
	<description>俺と周りの変態リタラシーを埋める</description>
	<lastBuildDate>Sun, 05 Sep 2010 14:56:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.8maki.jp/tag/npapi/feed" />
		<item>
		<title>FirefoxやChromeのPlugin開発に便利なnixysa</title>
		<link>http://blog.8maki.jp/2009/10/nixysa-npapi-gluecode-genereator.html</link>
		<comments>http://blog.8maki.jp/2009/10/nixysa-npapi-gluecode-genereator.html#comments</comments>
		<pubDate>Thu, 08 Oct 2009 16:42:49 +0000</pubDate>
		<dc:creator>8maki</dc:creator>
				<category><![CDATA[survey]]></category>
		<category><![CDATA[テクノロジー]]></category>
		<category><![CDATA[browser plugin]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[nixysa]]></category>
		<category><![CDATA[NPAPI]]></category>

		<guid isPermaLink="false">http://blog.8maki.jp/?p=523</guid>
		<description><![CDATA[
			
				
			
		
今日はかなりマニアックなネタです。FirefoxやGoogle Chromeのエクステンションを開発する際に、Native Codeにアクセスする必要がある人用のエントリですｗ
※エクステンションとプラグインという言葉は明示的に分けます。前者はFirefox-AddonやChrome-extensionといった拡張機能、後者はFlash Player PluginやAcrobat Reader Plugin等のNative Codeとして実行されるPluginを指します。
エクステンションからNative Codeを扱う場合、javascriptを用いてNPAPI経由でプラグイン(C++クラス)にアクセスする方法があります。NPAPIはMozillaがメインで進めている、ブラウザがプラグインを実行する際に使うAPIです。
ただ、レファレンスを見ていただけるとわかるのですが、とても面倒くさそうｗ C++の時点でWeb系Developerには障壁が高いのに、Windowの制御やGUI表現等数多くのAPIを抑えないといけないのが非常に厄介。
そこで登場したのが、nixysa。これは純粋なC++コードからNPAPIに準拠するコード、ブラウザから利用するプラグインを生成してくれる便利なGeneratorです。これを用いればNPAPIコードの部分を無視してプラグインの開発が行えます。
説明よりもソースをお見せした方が早いです。helloworld.ccのような純粋なC++コードからプラグインを生成し、helloworld.html内のjavascriptから呼べるようになります。
helloworld.h

#include &#60;string&#62;

class HelloWorld {
public:
HelloWorld() {}
std::string GetHw();
};
#endif  // HELLOWORLD_H

helloworld.cc

#include &#60;string&#62;
#include &#34;helloworld.h&#34;

std::string HelloWorld::GetHw() {
std::string hw;
hw = &#34;Hellow World&#34;;
return hw;
}

#ifndef HELLOWORLD_H
#define HELLOWORLD_H

↑「Hello World」を返すGetHwメソッドを持つHelloWorldクラスです。
helloworld.html

&#60;html&#62;
&#60;head&#62;
&#60;script type=&#34;text/javascript&#34;&#62;

function init() {
  var plugin = document.getElementById(&#34;plugin&#34;);
  var hw = plugin.HelloWorld();
  if (!hw) {
    alert(&#34;no plugin&#34;);
  }

  [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fblog.8maki.jp%2F2009%2F10%2Fnixysa-npapi-gluecode-genereator.html"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fblog.8maki.jp%2F2009%2F10%2Fnixysa-npapi-gluecode-genereator.html&amp;style=normal" height="61" width="50" /><br />
			</a>
		</div>
<p>今日はかなりマニアックなネタです。FirefoxやGoogle Chromeのエクステンションを開発する際に、Native Codeにアクセスする必要がある人用のエントリですｗ<br />
※エクステンションとプラグインという言葉は明示的に分けます。前者はFirefox-AddonやChrome-extensionといった拡張機能、後者はFlash Player PluginやAcrobat Reader Plugin等のNative Codeとして実行されるPluginを指します。</p>
<p>エクステンションからNative Codeを扱う場合、javascriptを用いて<a href="https://developer.mozilla.org/ja/Plugins" target="_blank">NPAPI</a>経由でプラグイン(C++クラス)にアクセスする方法があります。NPAPIはMozillaがメインで進めている、ブラウザがプラグインを実行する際に使うAPIです。</p>
<p>ただ、<a href="https://developer.mozilla.org/ja/Gecko_Plugin_API_Reference" target="_blank">レファレンス</a>を見ていただけるとわかるのですが、とても面倒くさそうｗ C++の時点でWeb系Developerには障壁が高いのに、Windowの制御やGUI表現等数多くのAPIを抑えないといけないのが非常に厄介。</p>
<p>そこで登場したのが、<a href="http://code.google.com/p/nixysa/wiki/NixysaIntro" target="_blank">nixysa</a>。これは純粋なC++コードからNPAPIに準拠するコード、ブラウザから利用するプラグインを生成してくれる便利なGeneratorです。これを用いればNPAPIコードの部分を無視してプラグインの開発が行えます。</p>
<p>説明よりもソースをお見せした方が早いです。helloworld.ccのような純粋なC++コードからプラグインを生成し、helloworld.html内のjavascriptから呼べるようになります。</p>
<p>helloworld.h</p>
<pre class="brush: cpp;">
#include &lt;string&gt;

class HelloWorld {
public:
HelloWorld() {}
std::string GetHw();
};
#endif  // HELLOWORLD_H
</pre>
<p>helloworld.cc</p>
<pre class="brush: cpp;">
#include &lt;string&gt;
#include &quot;helloworld.h&quot;

std::string HelloWorld::GetHw() {
std::string hw;
hw = &quot;Hellow World&quot;;
return hw;
}

#ifndef HELLOWORLD_H
#define HELLOWORLD_H
</pre>
<p>↑「Hello World」を返すGetHwメソッドを持つHelloWorldクラスです。</p>
<p>helloworld.html</p>
<pre class="brush: xml;">
&lt;html&gt;
&lt;head&gt;
&lt;script type=&quot;text/javascript&quot;&gt;

function init() {
  var plugin = document.getElementById(&quot;plugin&quot;);
  var hw = plugin.HelloWorld();
  if (!hw) {
    alert(&quot;no plugin&quot;);
  }

  alert(hw.getHw());
}
&lt;/script&gt;
&lt;/head&gt;

&lt;body onload=&quot;init()&quot;&gt;
&lt;object type=&quot;application/HelloWorld&quot; id=&quot;plugin&quot; width=&quot;0&quot; height=&quot;0&quot;&gt; &lt;/object&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>↑C++で書かれたHelloWorldクラスのgetHwメソッドの返り値をalertしています。&lt;object&gt;タグでHelloWorldプラグインの利用を明示しています。</p>
<p>本来ならNPAPIを使ったかなり長めのC++コードを書かないといけないのですが、こんな単純なC++コードだけでプラグインが開発できちゃうなんて、すばらしい！NPAPIのレファレンスをうんうん眺めなくても作れるというのが気楽。</p>
<p>なお、nixysaでプラグインを生成する際、PythonとSConsというMakeのようなコンパイラが必要です。SConsをapt-getでインストールする際、Python2.6だとエラーが出たので、Python2.5に戻すとインストールできました。実行環境はVMware Player上のUbuntu8.0.4です。sconsを指定のフォルダで実行するとlibhelloworld.soが生成され、これをブラウザのプラグインフォルダに追加するとプラグインとして使えるようになります。Windowsだとhelloworld.dllができるのかな？</p>
<pre class="brush: bash;">
sudo apt-get install scons
cd [PROJECT_HOME]/examples/helloworld
scons
</pre>
<p>プラグインを生成する際には、上記のC++コードに加え、SConsのMakefileにあたるSConstructファイルとC++クラスのIDLを用意する必要があります。そこが面倒くさいのですが、nixysaのパッケージに入っているサンプルプロジェクトの該当ファイルからパクればなんとかなりますｗ</p>
<p>今はSubversionで公開されているので、試してみたい方は下記のレポジトリから。</p>
<pre class="brush: bash;">
svn checkout http://nixysa.googlecode.com/svn/trunk/ nixysa-read-only
</pre>
<p>とは言え、まだまだ開発途上のプロジェクトなので、色々とバグがあったり、ドキュメントがほとんど無かったりしますので、ご注意を。</p>
<p>参考：<br />
» <a href="http://journal.mycom.co.jp/news/2009/04/03/039/index.html" target="_blank">Google Chrome/Firefoxプラグイン開発ツールNixysa登場</a><br />
» <a href="http://code.google.com/chrome/extensions/npapi.html" target="_blank"> NPAPI Plugins // Google Chrome Extensions: Developer Documentation</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.8maki.jp/2009/10/nixysa-npapi-gluecode-genereator.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.8maki.jp/2009/10/nixysa-npapi-gluecode-genereator.html" />
	</item>
	</channel>
</rss>
