Rubyな人とJavaな人でGAE/Jを取り組むこととなったので、ハイブリッド案が出来ないか検討した結果をまとめておく。
Jruby と Java
JrubyはJavaVMの上で動くRubyなので Jruby から Java のライブラリを 呼び出す事が出来る。
また逆にJavaからJruby環境を用いてrubyスクリプト評価も出来る。
GAE/Jの環境だと
GAE/Jの環境だと、JavaとJruby(rack) を混在させ、web.xml等で 制御する事も可能かと思う。
図にまとめてみた

JrubyJava posted by (C)k1ha410
JrubyからJava
JrubyからJavaを利用するに当たり以下のURLを参考にした。
自作のJavaライブラリ
とりあえず(Java良く知らないけど) Java のライブラリを作ってみた。 初めて書いたので、jarの作り方すら分からなかったけど(^^;
以下のクラスを、myCustomLib.jar とした。
package myCustomLib;
public class CustomLib {
public static int Add( int x , int y )
{
return x+y;
}
public static int Add( int[] nums )
{
int sum = 0;
for ( int ii=0; ii<nums.length; ++ii)
sum += nums[ii];
return sum;
}
public static String AddAndConvertToString(int x , int y )
{
return Integer.toString(Add(x,y));
}
public static int[] Inc( int[] nums )
{
for ( int ii=0; ii<nums.length; ++ii)
nums[ii] += 1;
return nums;
}
}
Javaからcallしてみた
どのようにJavaから呼び出せばいいのか?となるので、mainを作って呼び出してみた
public class Hello {
/**
* @param args
*/
public static void main(String[] args) {
System.out.print("Add \n");
System.out.print(myCustomLib.CustomLib.Add(6, 7));
System.out.print("\nAdd nums\n");
int[] n = {5,6,7};
System.out.print(myCustomLib.CustomLib.Add(n));
System.out.print("\nAdd AddAndConvertToString\n");
System.out.print(myCustomLib.CustomLib.AddAndConvertToString(7,8));
int[] n2 = {5,6,7};
System.out.print("\nAdd inc\n");
int[] r = myCustomLib.CustomLib.Inc(n2);
for (int ii=0; ii<n2.length; ++ii )
{
System.out.print(r[ii]);
}
}
}
Jrubyから呼び出し
以下の手順で行った
- myCustomLib.jarファイルをWEB-INF\lib\へコピー
- sinatraのアプリケーションから呼び出す
require 'sinatra'
import 'myCustomLib.CustomLib'
get '/' do
x = 1+2
y = CustomLib.Add(5,6)
ary = [5,6,7]
y2 = CustomLib.Add(ary.to_java(:int))
y3 = CustomLib.AddAndConvertToString(5,6)
y4j = CustomLib.Inc(ary.to_java(:int))
y4 = y4j.to_a
"hello world x:#{x} y:#{y} y2:#{y2} y3:#{y3} #{y3.class} y4:#{y4.join(' ')} #{y4.class}"
end
注意点
- importで利用するクラスの完全な名前(というのかな?)をimport
- 呼び出す時に、数値や文字列はそのままでいいみたい
- 配列は to_java や to_a を用いて ruby配列<->Java配列の変換をする
等が必要そうである。
まとめ
とりあえず、基本的な型でJava <-> Ruby の相互変換は出来た


コメントする