MYPerl.java
最終更新:2009/10/24
001: public class MYPerl { 002: static { 003: System.loadLibrary("myperl"); 004: } 005: 006: // ネイティブメソッド群 007: private static native void _start(); 008: private static native void _stop(); 009: private native int _initialize(); 010: private native void _terminate(int pi); 011: private native int _eval(int pi, String script); 012: private native String _getSvPV(int pi, int sv); 013: private native void _load_module(int pi, String modName); 014: 015: // Perl 環境を初期化したか否かを保管する変数(true:初期化済、false:まだ初期化されていない) 016: private static boolean perl_sys_init = false; 017: 018: private static void start() { 019: _start(); 020: perl_sys_init = true; 021: } 022: 023: // 最後の最後に Perl の終期化するメソッド。このメソッド実行後はインスタンスも含めてすべてのメソッドの実行は無効になる。 024: public static void stop() { 025: if (perl_sys_init) { // 初期化済の時のみ処理 026: _stop(); 027: perl_sys_init = false; 028: } 029: } 030: 031: // Perl インタプリタへの参照を保管する変数 032: private int pi=0; 033: 034: // 直前の eval 結果への参照を保管する変数 035: private int result=0; 036: 037: public MYPerl () { 038: initialize(); 039: } 040: 041: private void initialize() { 042: if (perl_sys_init) { 043: pi = _initialize(); 044: } else { 045: // ここで Exception を投げてもいいが、何もしない。 046: } 047: } 048: 049: public void terminate() { 050: if (perl_sys_init && pi != 0) {// start() かつ initialize() 後のみネイティブメソッド実行 051: _terminate(pi); 052: } else { 053: // ここで Exception を投げてもいいが、何もしない。 054: } 055: pi = 0; 056: result = 0; 057: } 058: 059: public void eval (String scriptText) { 060: if (perl_sys_init && pi != 0) { // start() かつ initialize() 後のみネイティブメソッド実行 061: result = _eval(pi, scriptText); 062: } else { 063: // ここで Exception を投げてもいいが、何もしない。 064: result = 0; 065: } 066: } 067: 068: // 直前の eval 後のスカラーのポイント型の値の参照 069: public String getSvPV() { 070: if (perl_sys_init && pi != 0) { // start() かつ initialize() 後のみネイティブメソッド実行 071: return _getSvPV(pi, result); 072: } else { 073: // ここで Exception を投げてもいいが、何もしない。 074: } 075: return null; 076: } 077: 078: public void loadModule (String modName) { 079: if (perl_sys_init && pi != 0) { // start() かつ initialize() 後のみネイティブメソッド実行 080: _load_module(pi, modName); 081: } else { 082: // ここで Exception を投げてもいいが、何もしない。 083: } 084: } 085: 086: static { // 事前に start() しておく。 087: start(); 088: } 089: 090: }
KAKU PROJECT (2009) |