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) |