myperl.c

最終更新:2009/10/25

myperl.c

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: }
Copyright (C) KAKU PROJECT (2009)KAKU PROJECT (2009)