myperl.c
最終更新:2009/10/25
001: #include <EXTERN.h> 002: #include <perl.h> 003: #include "MYPerl.h" 004: 005: /* perlxsi.c で定義 */ 006: EXTERN_C void xs_init (pTHX); 007: 008: /* 009: * Class: MYPerl 010: * Method: _start 011: * Signature: ()V 012: */ 013: JNIEXPORT void JNICALL Java_MYPerl__1start 014: (JNIEnv *jniEnv, jclass jcls) { 015: 016: int ac=1; 017: char **av=NULL; 018: char **ev=NULL; 019: PERL_SYS_INIT3(&ac, &av, &ev); 020: } 021: 022: /* 023: * Class: MYPerl 024: * Method: _stop 025: * Signature: ()V 026: */ 027: JNIEXPORT void JNICALL Java_MYPerl__1stop 028: (JNIEnv *jniEnv, jclass jcls) { 029: PERL_SYS_TERM(); 030: } 031: 032: /* 033: * Class: MYPerl 034: * Method: _initialize 035: * Signature: (Ljava/lang/String;)I 036: */ 037: JNIEXPORT jint JNICALL Java_MYPerl__1initialize 038: (JNIEnv *jniEnv, jobject jobj) 039: { 040: PerlInterpreter *my_perl; 041: char *embedding[] = { "", "-e", "0" }; 042: 043: my_perl = perl_alloc(); 044: perl_construct( my_perl ); 045: perl_parse(my_perl, xs_init, 3, embedding, NULL); 046: PL_exit_flags |= PERL_EXIT_DESTRUCT_END; 047: perl_run(my_perl); 048: return (jint)my_perl; 049: } 050: 051: /* 052: * Class: MYPerl 053: * Method: _terminate 054: * Signature: (I)V 055: */ 056: 057: JNIEXPORT void JNICALL Java_MYPerl__1terminate 058: (JNIEnv * jniEnv, jobject jobj, jint jintPi) 059: { 060: PerlInterpreter *my_perl = (PerlInterpreter *)jintPi; 061: PERL_SET_CONTEXT(my_perl); 062: perl_destruct(my_perl); 063: perl_free(my_perl); 064: } 065: 066: /* 067: * Class: MYPerl 068: * Method: _eval 069: * Signature: (ILjava/lang/String;)I 070: */ 071: JNIEXPORT jint JNICALL Java_MYPerl__1eval 072: (JNIEnv *jniEnv, jobject jobj, jint jintPi, jstring jstrX) 073: { 074: jint ret; 075: PerlInterpreter *my_perl = (PerlInterpreter *)jintPi; 076: const char *x = (*jniEnv)->GetStringUTFChars(jniEnv, jstrX, 0); 077: 078: PERL_SET_CONTEXT(my_perl); 079: ret = (jint)eval_pv((char*)x, TRUE); 080: 081: (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstrX, x); 082: 083: return ret; 084: } 085: 086: /* 087: * Class: MYPerl 088: * Method: _getSvPV 089: * Signature: (II)Ljava/lang/String; 090: */ 091: JNIEXPORT jstring JNICALL Java_MYPerl__1getSvPV 092: (JNIEnv *jniEnv, jobject jobj, jint jintPi, jint jintX) 093: { 094: char *svpv; 095: jstring ret; 096: PerlInterpreter *my_perl = (PerlInterpreter *)jintPi; 097: SV *x = (SV*)jintX; 098: 099: STRLEN n_a; 100: PERL_SET_CONTEXT(my_perl); 101: svpv = SvPV(x, n_a); 102: ret = (*jniEnv)->NewStringUTF(jniEnv, svpv); 103: free(svpv); 104: 105: return ret; 106: } 107: 108: /* 109: * Class: MYPerl 110: * Method: _load_module 111: * Signature: (ILjava/lang/String;)Ljava/lang/String; 112: */ 113: JNIEXPORT void JNICALL Java_MYPerl__1load_1module 114: (JNIEnv *jniEnv, jobject jobj, jint jintPi, jstring jstrModName) 115: { 116: PerlInterpreter *my_perl = (PerlInterpreter *)jintPi; 117: const char *modName = (*jniEnv)->GetStringUTFChars(jniEnv, jstrModName, NULL); 118: PERL_SET_CONTEXT(my_perl); 119: load_module(PERL_LOADMOD_NOIMPORT, newSVpvn((char*)modName, strlen(modName)), 120: newSVnv(0.0)); 121: (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstrModName, modName); 122: }
KAKU PROJECT (2009) |