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

📄 guile-jvm.c

📁 gcc的组建
💻 C
字号:
/* *  Guile/JNI/JVM Testing Framework *  *  Copyright (c) 1998 Free Software Foundation, Inc. *  Written by Paul Fisher (rao@gnu.org) *  *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,  *  USA. */#include <stdlib.h>#include <stdio.h>#include <libguile.h>#include <guile/gh.h>#include <jni.h>static JNIEnv *env;static jclass test_class, result_class;static jmethodID test_mid, test_name_mid, result_name_mid, result_msg_mid;SCMabort_test (SCM name, char *exception){  (*env)->ExceptionClear (env);  return gh_list (name,		  gh_symbol2scm ("ERROR"), 		  gh_str02scm (exception),		  SCM_UNDEFINED);}SCMhandle_test_exception (jobject test_name_obj){  jthrowable throwable;  jclass object_class;  jobject err_msg_obj;  char *err_msg, *test_name;  const char *utf;  SCM result;  jboolean is_copy;  static jmethodID obj_toString_mid = NULL;  throwable = (*env)->ExceptionOccurred (env);  (*env)->ExceptionClear (env);  if (obj_toString_mid == NULL)    obj_toString_mid = (*env)->GetMethodID (env, 					    (*env)->FindClass (env, 							  "java/lang/Object"), 					    "toString", 					    "()Ljava/lang/String;");  err_msg_obj = (*env)->CallObjectMethod (env, throwable, obj_toString_mid);  utf = (*env)->GetStringUTFChars (env, err_msg_obj, &is_copy);  err_msg = strdup (utf);  (*env)->ReleaseStringUTFChars (env, err_msg_obj, utf);  utf = (*env)->GetStringUTFChars (env, test_name_obj, &is_copy);  test_name = strdup (utf);  (*env)->ReleaseStringUTFChars (env, test_name_obj, utf);  result = abort_test (gh_str02scm (test_name), err_msg);  free (err_msg);  free (test_name);  return result;}   SCMperform_test (SCM clazz_scm_name){  char *clazz_name, *test_name, *result_name, *msg;  const char *utf;  jclass clazz;  jmethodID mid;  jobject test_obj, result_obj, test_name_obj, result_name_obj, msg_obj;  jboolean is_copy;  SCM scm_test_name, scm_result_name, scm_result_msg;  clazz_name = gh_scm2newstr (clazz_scm_name, NULL);  clazz = (*env)->FindClass (env, clazz_name);  if (clazz == NULL)    {      SCM clazz_err = gh_str02scm (clazz_name);      free (clazz_name);      return abort_test (clazz_err, "Unable to find class");    }  mid = (*env)->GetMethodID (env, clazz, "<init>", "()V");  test_obj = (*env)->NewObject (env, clazz, mid);  if ((*env)->IsInstanceOf (env, test_obj, test_class) == JNI_FALSE)    {      SCM clazz_err = gh_str02scm (clazz_name);      free (clazz_name);      return abort_test (clazz_err, "Not an instanceof gnu.test.Test");    }  free (clazz_name);  /* Call all the Java testing methods */  test_name_obj = (*env)->CallObjectMethod (env, test_obj, test_name_mid);  result_obj = (*env)->CallObjectMethod (env, test_obj, test_mid);  /* Handle an exception if one occurred */  if ((*env)->ExceptionOccurred (env))      return handle_test_exception (test_name_obj);  result_name_obj = (*env)->CallObjectMethod (env, result_obj, 					      result_name_mid);  msg_obj = (*env)->CallObjectMethod (env, result_obj, result_msg_mid);  /* Grab all the C result messages */  utf = (*env)->GetStringUTFChars (env, test_name_obj, &is_copy);  test_name = strdup (utf);  (*env)->ReleaseStringUTFChars (env, test_name_obj, utf);  utf = (*env)->GetStringUTFChars (env, result_name_obj, &is_copy);  result_name = strdup (utf);  (*env)->ReleaseStringUTFChars (env, result_name_obj, utf);  utf = (*env)->GetStringUTFChars (env, msg_obj, &is_copy);  msg = strdup (utf);  (*env)->ReleaseStringUTFChars (env, msg_obj, utf);  /* Convert the C result messages to Scheme */  scm_test_name = gh_str02scm (test_name);  scm_result_name = gh_symbol2scm (result_name);  scm_result_msg = gh_str02scm (msg);  /* Free up the C result messages */  free (test_name);  free (result_name);  free (msg);  return gh_list (scm_test_name,		  scm_result_name,		  scm_result_msg,		  SCM_UNDEFINED);}intinit_testing_framework (){  JavaVM *jvm;  JDK1_1InitArgs vm_args;  vm_args.version = 0x00010001;  JNI_GetDefaultJavaVMInitArgs (&vm_args);  vm_args.classpath = getenv ("CLASSPATH");  if (JNI_CreateJavaVM (&jvm, &env, &vm_args) < 0)    return -1;  test_class = (*env)->FindClass (env, "gnu/test/Test");  if (test_class == NULL)    {      fprintf (stderr, "Unable to locate gnu.test.Test\n");      return -1;    }  test_class = (*env)->NewGlobalRef (env, test_class);  result_class = (*env)->FindClass (env, "gnu/test/Result");  if (result_class == NULL)    {      fprintf (stderr, "Unable to locate gnu.test.Result\n");      return -1;    }  result_class = (*env)->NewGlobalRef (env, result_class);  test_mid = (*env)->GetMethodID (env, test_class, "test", 				  "()Lgnu/test/Result;");  test_name_mid = (*env)->GetMethodID (env, test_class, "getName", 				       "()Ljava/lang/String;");  if (test_mid == NULL || test_name_mid == NULL)    {      fprintf (stderr, "Malformed gnu.test.Test class\n");      return -1;    }  result_name_mid = (*env)->GetMethodID (env, result_class, "getName", 					 "()Ljava/lang/String;");  result_msg_mid = (*env)->GetMethodID (env, result_class, "getMsg", 					"()Ljava/lang/String;");  if (result_name_mid == NULL || result_msg_mid == NULL)    {      fprintf (stderr, "Malformed gnu.test.Result class\n");      return -1;    }  gh_new_procedure1_0 ("test", perform_test);  return 0;}static voidinner_main (void *closure, int argc, char **argv){  if (init_testing_framework () < 0)    {      fprintf (stderr, "Unable to instantiate JVM.\n");      exit (1);    }  scm_shell (argc, argv);}intmain (int argc, char **argv){  scm_boot_guile (argc, argv, inner_main, 0);  return 0;}

⌨️ 快捷键说明

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