⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jniutils.c

📁 Bean Scripting Framework (BSF)为在java应用中使用脚本语言
💻 C
字号:
/* * Copyright 2003,2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#include <string.h>#include <jni.h>#include "JNIUtils.h"/***** * * NOTE: Whereever I think an exception may occur, I need to check * whether it did and recover appropriately .. otherwise the behavior * of JNI is undefined! * *****//* throw a BSFException with the given code and message. */void bsf_exception (JNIEnv *jenv, int code, char *msg) {  jclass bsfexceptclass =     (*jenv)->FindClass (jenv, "org/apache/bsf/BSFException");  (*jenv)->ThrowNew (jenv, bsfexceptclass, msg);}/* cvt a pointer to a Long object whose value is the pointer value */jobject bsf_pointer2longobj (JNIEnv *jenv, void *ptr) {  return bsf_makeLong (jenv, (long) ptr);}/* cvt a Long object whose value is the pointer value to the pointer */void *bsf_longobj2pointer (JNIEnv *jenv, jobject lobj) {  jclass longclass = (*jenv)->FindClass (jenv, "java/lang/Long");  jmethodID mi = (*jenv)->GetMethodID (jenv, longclass, "longValue", "()J");  void *ptr = (void *) (*jenv)->CallLongMethod (jenv, lobj, mi);  return ptr;}/* convert an object to a string obj */jstring bsf_obj2jstring (JNIEnv *jenv, jobject obj) {  jclass objclass = (*jenv)->GetObjectClass (jenv, obj);  jmethodID tostr = (*jenv)->GetMethodID (jenv, objclass, "toString",					  "()Ljava/lang/String;");  jstring strobj = (jstring) (*jenv)->CallObjectMethod (jenv, obj, tostr);  return strobj;}/* cvt an object to a c-string .. wastes memory, but useful for debug */const char *bsf_obj2cstring (JNIEnv *jenv, jobject obj) {  return (*jenv)->GetStringUTFChars (jenv, 				     bsf_obj2jstring (jenv, obj),				     0);}/* call the named method with the given args on the given bean */jobject bsf_createbean (JNIEnv *jenv, char *classname, jobjectArray args) {  jclass cl;  jmethodID mid;  jobject result;  /* find the BSFUtils.createBean method ID if needed */  cl = (*jenv)->FindClass (jenv, "org/apache/bsf/util/EngineUtils");  mid = (*jenv)->GetStaticMethodID (jenv, cl, "createBean",      			      "(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;");  if ((*jenv)->ExceptionOccurred (jenv)) {    (*jenv)->ExceptionDescribe (jenv);    (*jenv)->ExceptionClear (jenv);    return 0;  }  result = (*jenv)->CallStaticObjectMethod (jenv, cl, mid, 					    (*jenv)->NewStringUTF (jenv,								   classname),					    args);  if ((*jenv)->ExceptionOccurred (jenv)) {    (*jenv)->ExceptionDescribe (jenv);    (*jenv)->ExceptionClear (jenv);    /* I should really throw a BSF exception here and the caller should       check whether an exception was thrown and in that case return.       later. */    return 0;  } else {    return result;  }}/* call the named method with the given args on the given bean */jobject bsf_callmethod (JNIEnv *jenv, jobject target,			char *methodname, jobjectArray args) {  jclass cl;  jmethodID mid;  jobject result;  /* find the BSFUtils.callBeanMethod method ID if needed */  cl = (*jenv)->FindClass (jenv, "org/apache/bsf/util/EngineUtils");  mid = (*jenv)->GetStaticMethodID (jenv, cl, "callBeanMethod",				      "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;");  if ((*jenv)->ExceptionOccurred (jenv)) {      (*jenv)->ExceptionDescribe (jenv);      (*jenv)->ExceptionClear (jenv);      return 0;    }  result = (*jenv)->CallStaticObjectMethod (jenv, cl, mid, target,					    (*jenv)->NewStringUTF (jenv,								   methodname),					    args);  if ((*jenv)->ExceptionOccurred (jenv)) {    (*jenv)->ExceptionDescribe (jenv);    (*jenv)->ExceptionClear (jenv);    /* I should really throw a BSF exception here and the caller should       check whether an exception was thrown and in that case return.       later. */    return 0;  } else {    return result;  }}/* return the named bean from the given mgr's bean registry */jobject bsf_lookupbean (JNIEnv *jenv, jobject mgr, char *beanname) {  jmethodID lookupMethod;  jobject result;  jclass bsfmgrclass = (*jenv)->GetObjectClass (jenv, mgr);  lookupMethod =       (*jenv)->GetMethodID (jenv, bsfmgrclass, "lookupBean",			    "(Ljava/lang/String;)Ljava/lang/Object;");  if ((*jenv)->ExceptionOccurred (jenv)) {      (*jenv)->ExceptionDescribe (jenv);      (*jenv)->ExceptionClear (jenv);      return 0;    }  result = (*jenv)->CallObjectMethod (jenv, mgr, lookupMethod, 				      (*jenv)->NewStringUTF (jenv, beanname));  if ((*jenv)->ExceptionOccurred (jenv)) {    (*jenv)->ExceptionDescribe (jenv);    (*jenv)->ExceptionClear (jenv);    /* I should really throw a BSF exception here and the caller should       check whether an exception was thrown and in that case return.       later. */    return 0;  } else {    return result;  }}/* return the type signature string component for the given type:   I for ints, J for long, ... */char *bsf_getTypeSignatureString (JNIEnv *jenv, jclass objclass) {  jclass cl = 0;  jmethodID mid = 0;  jstring str;  cl = (*jenv)->FindClass (jenv, "org/apache/bsf/util/EngineUtils");  mid = (*jenv)->GetStaticMethodID (jenv, cl, "getTypeSignatureString",      			      "(Ljava/lang/Class;)Ljava/lang/String;");  if ((*jenv)->ExceptionOccurred (jenv)) {    (*jenv)->ExceptionDescribe (jenv);    (*jenv)->ExceptionClear (jenv);    return 0;  }  str = (jstring) (*jenv)->CallStaticObjectMethod (jenv, cl, mid, objclass);  return (char *) bsf_obj2cstring (jenv, str);}/* make objects from primitives */jobject bsf_makeBoolean (JNIEnv *jenv, int val) {  jclass classobj = (*jenv)->FindClass (jenv, "java/lang/Boolean");  jmethodID constructor =     (*jenv)->GetMethodID (jenv, classobj, "<init>", "(Z)V");  return (*jenv)->NewObject (jenv, classobj, constructor, (jboolean) val);}jobject bsf_makeByte (JNIEnv *jenv, int val) {  jclass classobj = (*jenv)->FindClass (jenv, "java/lang/Byte");  jmethodID constructor =     (*jenv)->GetMethodID (jenv, classobj, "<init>", "(B)V");  return (*jenv)->NewObject (jenv, classobj, constructor, (jbyte) val);}jobject bsf_makeShort (JNIEnv *jenv, int val) {  jclass classobj = (*jenv)->FindClass (jenv, "java/lang/Short");  jmethodID constructor =     (*jenv)->GetMethodID (jenv, classobj, "<init>", "(S)V");  return (*jenv)->NewObject (jenv, classobj, constructor, (jshort) val);}jobject bsf_makeInteger (JNIEnv *jenv, int val) {  jclass classobj = (*jenv)->FindClass (jenv, "java/lang/Integer");  jmethodID constructor =     (*jenv)->GetMethodID (jenv, classobj, "<init>", "(I)V");  return (*jenv)->NewObject (jenv, classobj, constructor, (jint) val);}jobject bsf_makeLong (JNIEnv *jenv, long val) {  jclass classobj = (*jenv)->FindClass (jenv, "java/lang/Long");  jmethodID constructor =     (*jenv)->GetMethodID (jenv, classobj, "<init>", "(J)V");  return (*jenv)->NewObject (jenv, classobj, constructor, (jlong) val);}jobject bsf_makeFloat (JNIEnv *jenv, float val) {  jclass classobj = (*jenv)->FindClass (jenv, "java/lang/Float");  jmethodID constructor =     (*jenv)->GetMethodID (jenv, classobj, "<init>", "(F)V");  return (*jenv)->NewObject (jenv, classobj, constructor, (jfloat) val);}jobject bsf_makeDouble (JNIEnv *jenv, double val) {  jclass classobj = (*jenv)->FindClass (jenv, "java/lang/Double");  jmethodID constructor =     (*jenv)->GetMethodID (jenv, classobj, "<init>", "(D)V");  return (*jenv)->NewObject (jenv, classobj, constructor, (jdouble) val);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -