JrubyからJavaのコードを呼び出してみた

| コメント(0) | トラックバック(0) このエントリーを含むはてなブックマーク

Rubyな人とJavaな人でGAE/Jを取り組むこととなったので、ハイブリッド案が出来ないか検討した結果をまとめておく。

Jruby と Java

JrubyはJavaVMの上で動くRubyなので Jruby から Java のライブラリを 呼び出す事が出来る。

また逆にJavaからJruby環境を用いてrubyスクリプト評価も出来る。

GAE/Jの環境だと

GAE/Jの環境だと、JavaとJruby(rack) を混在させ、web.xml等で 制御する事も可能かと思う。

図にまとめてみた

JrubyJava
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から呼び出し

以下の手順で行った

  1. myCustomLib.jarファイルをWEB-INF\lib\へコピー
  2. 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 の相互変換は出来た

トラックバック(0)

トラックバックURL: http://www.m-tea.info/mt-tb.cgi/71

コメントする

あわせて読みたいブログパーツ

このブログ記事について

このページは、k1ha410が2010年2月 1日 23:39に書いたブログ記事です。

ひとつ前のブログ記事は「あなたのクラウドアプリでAzureを使う10の理由 (10 reasons to use Azure for your cloud apps)」です。

次のブログ記事は「Jruby on GAEで google アカウントを利用してみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。