?? clipsjni_environment.c
字號(hào):
/*=========================================*/
/* If the Java classes could not be found, */
/* abort creation of the environment. */
/*=========================================*/
if ((theLongClass == NULL) || (theDoubleClass == NULL) ||
(theArrayListClass == NULL) ||
(theVoidValueClass == NULL) ||
(theIntegerValueClass == NULL) || (theFloatValueClass == NULL) ||
(theSymbolValueClass == NULL) || (theStringValueClass == NULL) ||
(theInstanceNameValueClass == NULL) ||
(theMultifieldValueClass == NULL) ||
(theFactAddressValueClass == NULL) ||
(theInstanceAddressValueClass == NULL))
{ return((jlong) NULL); }
/*================================*/
/* Look up the Java init methods. */
/*================================*/
theLongInitMethod = (*env)->GetMethodID(env,theLongClass,"<init>","(J)V");
theDoubleInitMethod = (*env)->GetMethodID(env,theDoubleClass,"<init>","(D)V");
theArrayListInitMethod = (*env)->GetMethodID(env,theArrayListClass,"<init>","(I)V");
theArrayListAddMethod = (*env)->GetMethodID(env,theArrayListClass,"add","(Ljava/lang/Object;)Z");
theVoidValueInitMethod = (*env)->GetMethodID(env,theVoidValueClass,"<init>","()V");
theIntegerValueInitMethod = (*env)->GetMethodID(env,theIntegerValueClass,"<init>","(Ljava/lang/Long;)V");
theFloatValueInitMethod = (*env)->GetMethodID(env,theFloatValueClass,"<init>","(Ljava/lang/Double;)V");
theSymbolValueInitMethod = (*env)->GetMethodID(env,theSymbolValueClass,"<init>","(Ljava/lang/String;)V");
theStringValueInitMethod = (*env)->GetMethodID(env,theStringValueClass,"<init>","(Ljava/lang/String;)V");
theInstanceNameValueInitMethod = (*env)->GetMethodID(env,theInstanceNameValueClass,"<init>","(Ljava/lang/String;)V");
theMultifieldValueInitMethod = (*env)->GetMethodID(env,theMultifieldValueClass,"<init>","(Ljava/util/List;)V");
theFactAddressValueInitMethod = (*env)->GetMethodID(env,theFactAddressValueClass,"<init>","(JLCLIPSJNI/Environment;)V");
theInstanceAddressValueInitMethod = (*env)->GetMethodID(env,theInstanceAddressValueClass,"<init>","(JLCLIPSJNI/Environment;)V");
/*==============================================*/
/* If the Java init methods could not be found, */
/* abort creation of the enviroment. */
/*==============================================*/
if ((theLongInitMethod == NULL) || (theDoubleInitMethod == NULL) ||
(theArrayListInitMethod == NULL) || (theArrayListAddMethod == NULL) ||
(theVoidValueInitMethod == NULL) ||
(theIntegerValueInitMethod == NULL) || (theFloatValueInitMethod == NULL) ||
(theSymbolValueInitMethod == NULL) || (theStringValueInitMethod == NULL) ||
(theInstanceNameValueInitMethod == NULL) ||
(theMultifieldValueInitMethod == NULL) ||
(theFactAddressValueInitMethod == NULL) ||
(theInstanceAddressValueInitMethod == NULL))
{ return((jlong) NULL); }
/*=========================*/
/* Create the environment. */
/*=========================*/
theEnv = CreateEnvironment();
if (theEnv == NULL) return((jlong) NULL);
/*====================================*/
/* Allocate the JNI environment data. */
/*====================================*/
AllocateEnvironmentData(theEnv,CLIPSJNI_DATA,sizeof(struct clipsJNIData),DeallocateJNIData);
/*===================================================*/
/* Cache the class and method references (converting */
/* the local class references to global references */
/* so they won't be garbage collected. */
/*===================================================*/
CLIPSJNIData(theEnv)->longClass = (*env)->NewGlobalRef(env,theLongClass);
CLIPSJNIData(theEnv)->longInitMethod = theLongInitMethod;
CLIPSJNIData(theEnv)->doubleClass = (*env)->NewGlobalRef(env,theDoubleClass);
CLIPSJNIData(theEnv)->doubleInitMethod = theDoubleInitMethod;
CLIPSJNIData(theEnv)->arrayListClass = (*env)->NewGlobalRef(env,theArrayListClass);
CLIPSJNIData(theEnv)->arrayListInitMethod = theArrayListInitMethod;
CLIPSJNIData(theEnv)->arrayListAddMethod = theArrayListAddMethod;
CLIPSJNIData(theEnv)->voidValueClass = (*env)->NewGlobalRef(env,theVoidValueClass);
CLIPSJNIData(theEnv)->voidValueInitMethod = theVoidValueInitMethod;
CLIPSJNIData(theEnv)->integerValueClass = (*env)->NewGlobalRef(env,theIntegerValueClass);
CLIPSJNIData(theEnv)->integerValueInitMethod = theIntegerValueInitMethod;
CLIPSJNIData(theEnv)->floatValueClass = (*env)->NewGlobalRef(env,theFloatValueClass);
CLIPSJNIData(theEnv)->floatValueInitMethod = theFloatValueInitMethod;
CLIPSJNIData(theEnv)->symbolValueClass = (*env)->NewGlobalRef(env,theSymbolValueClass);
CLIPSJNIData(theEnv)->symbolValueInitMethod = theSymbolValueInitMethod;
CLIPSJNIData(theEnv)->stringValueClass = (*env)->NewGlobalRef(env,theStringValueClass);
CLIPSJNIData(theEnv)->stringValueInitMethod = theStringValueInitMethod;
CLIPSJNIData(theEnv)->instanceNameValueClass = (*env)->NewGlobalRef(env,theInstanceNameValueClass);
CLIPSJNIData(theEnv)->instanceNameValueInitMethod = theInstanceNameValueInitMethod;
CLIPSJNIData(theEnv)->multifieldValueClass = (*env)->NewGlobalRef(env,theMultifieldValueClass);
CLIPSJNIData(theEnv)->multifieldValueInitMethod = theMultifieldValueInitMethod;
CLIPSJNIData(theEnv)->factAddressValueClass = (*env)->NewGlobalRef(env,theFactAddressValueClass);
CLIPSJNIData(theEnv)->factAddressValueInitMethod = theFactAddressValueInitMethod;
CLIPSJNIData(theEnv)->instanceAddressValueClass = (*env)->NewGlobalRef(env,theInstanceAddressValueClass);
CLIPSJNIData(theEnv)->instanceAddressValueInitMethod = theInstanceAddressValueInitMethod;
/*======================================*/
/* Store the java environment for later */
/* access by the CLIPS environment. */
/*======================================*/
SetEnvironmentContext(theEnv,(void *) env);
/*=======================================*/
/* Deallocate the local Java references. */
/*=======================================*/
(*env)->DeleteLocalRef(env,theLongClass);
(*env)->DeleteLocalRef(env,theDoubleClass);
(*env)->DeleteLocalRef(env,theArrayListClass);
(*env)->DeleteLocalRef(env,theVoidValueClass);
(*env)->DeleteLocalRef(env,theIntegerValueClass);
(*env)->DeleteLocalRef(env,theFloatValueClass);
(*env)->DeleteLocalRef(env,theSymbolValueClass);
(*env)->DeleteLocalRef(env,theStringValueClass);
(*env)->DeleteLocalRef(env,theInstanceNameValueClass);
(*env)->DeleteLocalRef(env,theMultifieldValueClass);
(*env)->DeleteLocalRef(env,theFactAddressValueClass);
(*env)->DeleteLocalRef(env,theInstanceAddressValueClass);
/*=========================*/
/* Return the environment. */
/*=========================*/
return ((jlong) theEnv);
}
/*********************************************/
/* Java_CLIPSJNI_Environment_clear: Native */
/* function for the CLIPSJNI clear method. */
/* */
/* Class: CLIPSJNI_Environment */
/* Method: clear */
/* Signature: (J)V */
/*********************************************/
JNIEXPORT void JNICALL Java_CLIPSJNI_Environment_clear(
JNIEnv *env,
jobject obj,
jlong clipsEnv)
{
EnvClear((void *) clipsEnv);
}
/*********************************************/
/* Java_CLIPSJNI_Environment_reset: Native */
/* function for the CLIPSJNI reset method. */
/* */
/* Class: CLIPSJNI_Environment */
/* Method: reset */
/* Signature: (J)V */
/*********************************************/
JNIEXPORT void JNICALL Java_CLIPSJNI_Environment_reset(
JNIEnv *env,
jobject obj,
jlong clipsEnv)
{
EnvReset((void *) clipsEnv);
}
/********************************************/
/* Java_CLIPSJNI_Environment_load: Native */
/* function for the CLIPSJNI load method. */
/* */
/* Class: CLIPSJNI_Environment */
/* Method: load */
/* Signature: (JLjava/lang/String;)V */
/********************************************/
JNIEXPORT void JNICALL Java_CLIPSJNI_Environment_load(
JNIEnv *env,
jobject obj,
jlong clipsEnv,
jstring fileName)
{
const char *cFileName = (*env)->GetStringUTFChars(env,fileName,NULL);
EnvLoad((void *) clipsEnv,(char *) cFileName);
(*env)->ReleaseStringUTFChars(env,fileName,cFileName);
}
/**************************************************/
/* Java_CLIPSJNI_Environment_run: Native function */
/* for the CLIPSJNI run method. */
/* */
/* Class: CLIPSJNI_Environment */
/* Method: run */
/* Signature: (JJ)J */
/**************************************************/
JNIEXPORT jlong JNICALL Java_CLIPSJNI_Environment_run(
JNIEnv *env,
jobject obj,
jlong clipsEnv,
jlong runLimit)
{
return EnvRun((void *) clipsEnv,runLimit);
}
/*************************************************************/
/* Java_CLIPSJNI_Environment_eval: Native function for the */
/* CLIPSJNI eval method. */
/* */
/* Class: CLIPSJNI_Environment */
/* Method: eval */
/* Signature: (JLjava/lang/String;)LCLIPSJNI/PrimitiveValue; */
/* */
/*************************************************************/
JNIEXPORT jobject JNICALL Java_CLIPSJNI_Environment_eval(
JNIEnv *env,
jobject obj,
jlong clipsEnv,
jstring evalStr)
{
DATA_OBJECT theDO;
jobject result = NULL;
void *theCLIPSEnv = (void *) clipsEnv;
const char *cEvalStr = (*env)->GetStringUTFChars(env,evalStr,NULL);
EnvEval(theCLIPSEnv,(char *) cEvalStr,&theDO);
(*env)->ReleaseStringUTFChars(env,evalStr,cEvalStr);
result = ConvertDataObject(env,obj,theCLIPSEnv,&theDO);
return result;
}
/**********************/
/* ConvertDataObject: */
/**********************/
static jobject ConvertDataObject(
JNIEnv *env,
jobject javaEnv,
void *clipsEnv,
DATA_OBJECT *theDO)
{
jobject result = NULL, tresult;
jint mfLength;
struct multifield *theList;
long i;
switch(GetpType(theDO))
{
case MULTIFIELD:
mfLength = GetpDOLength(theDO);
result = (*env)->NewObject(env,
CLIPSJNIData(clipsEnv)->arrayListClass,
CLIPSJNIData(clipsEnv)->arrayListInitMethod,
(jint) mfLength);
if (result == NULL)
{ return result; }
theList = (struct multifield *) DOPToPointer(theDO);
for (i = GetpDOBegin(theDO); i <= GetpDOEnd(theDO); i++)
{
tresult = ConvertSingleFieldValue(env,javaEnv,clipsEnv,GetMFType(theList,i),GetMFValue(theList,i));
if (tresult != NULL)
{ (*env)->CallBooleanMethod(env,result,CLIPSJNIData(clipsEnv)->arrayListAddMethod,tresult); }
(*env)->DeleteLocalRef(env,tresult);
}
tresult = result;
result = (*env)->NewObject(env,
CLIPSJNIData(clipsEnv)->multifieldValueClass,
CLIPSJNIData(clipsEnv)->multifieldValueInitMethod,
tresult);
break;
case RVOID:
case SYMBOL:
case STRING:
case INSTANCE_NAME:
case INTEGER:
case FLOAT:
case FACT_ADDRESS:
case INSTANCE_ADDRESS:
result = ConvertSingleFieldValue(env,javaEnv,clipsEnv,GetpType(theDO),GetpValue(theDO));
break;
default:
break;
}
return result;
}
/****************************/
/* ConvertSingleFieldValue: */
/****************************/
static jobject ConvertSingleFieldValue(
JNIEnv *env,
jobject javaEnv,
void *clipsEnv,
int type,
void *value)
{
jobject result = NULL, tresult;
jstring sresult = NULL;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -