Firefox ExtensionでJavaプログラムを動かしてみるテスト
Firefox ExtensionでC++プログラムを動かしてみるテスト 〜その5 XULの実装〜 - かーねる・う゛いえむにっきからの続き。
もちろんJavaでもExtention書きたいよね?
って事で試してみた。
本当はXPCOMで実装してJS側は無変更と行きたいところなのだが、如何せん情報が少なくて良く分からない。
そこで、MozillaのJSからJavaを呼ぶための独自拡張であるLiveConnectを用いて実装してみる事とした。
例によって、Javaの実装はこんな感じ:
TestKVS.java
package com.dokukino.testkvs; import java.util.HashMap; import java.util.Map; public class TestKVS { private Map<Integer, Integer> store = new HashMap<Integer, Integer>(); public void close() { } public int get(int key) { return store.get(key); } public void open() { // TODO Auto-generated method stub } public void put(int key, int value) { store.put(key, value); } }
これをjarで固めてtestkvs@dokukino.com/java/testkvs.jarに置く。
あわせて、http://simile.mit.edu/repository/java-firefox-extension/tools/javaFirefoxExtensionUtils.jarをダウンロードしてきて同じくtestkvs@dokukino.com/java/へコピー。
そして、testkvs.jsを以下のように改造する:
testkvs.js
//Get extension folder installation path... var extensionPath = Components.classes["@mozilla.org/extensions/manager;1"]. getService(Components.interfaces.nsIExtensionManager). getInstallLocation("testkvs@dokukino.com"). // guid of extension getItemLocation("testkvs@dokukino.com"); // Get path to the JAR files (the following assumes your JARs are within a // directory called "java" at the root of your extension's folder hierarchy) // You must add this utilities (classloader) JAR to give your extension full privileges var classLoaderJarpath = "file:///" + extensionPath.path.replace(/\\/g,"/") + "/java/javaFirefoxExtensionUtils.jar"; // Add the paths for all the other JAR files that you will be using var myJarpath = "file:///" + extensionPath.path.replace(/\\/g,"/") + "/java/testkvs.jar"; // seems you don't actually have to replace the backslashes as they work as well var urlArray = []; // Build a regular JavaScript array (LiveConnect will auto-convert to a Java array) urlArray[0] = new java.net.URL(myJarpath); urlArray[1] = new java.net.URL(classLoaderJarpath); var cl = java.net.URLClassLoader.newInstance(urlArray); var myClass = cl.loadClass('com.dokukino.testkvs.TestKVS'); // use the same loader from above var kvs = myClass.newInstance(); //var kvs = Components.classes["@dokukino.com/testKVS;1"].createInstance(Components.interfaces.testIKVS); kvs.open(); function get() { var key = document.getElementById('key').value; var value = kvs.get(key); document.getElementById('value').value = value; } function put() { var key = document.getElementById('key').value; var value = document.getElementById('value').value; kvs.put(key, value); document.getElementById('key').value = ''; document.getElementById('value').value = ''; }
長ったらしいが、ようはこのコードでjarをロードしてインスタンスを生成している。
従来Components.classes[].createInstance()で行っていた処理と同じだ。
動作テストを行ってみると、ちゃんとC++版と同じように動作する事が確認出来ると思う。
参考資料:Java in Firefox Extensions - Archive of obsolete content | MDN