Author: mturk Date: Fri Aug 21 18:13:55 2009 New Revision: 806663 URL: http://svn.apache.org/viewvc?rev=806663&view=rev Log: Add jvm test case
Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c commons/sandbox/runtime/trunk/src/main/native/test/testsuite.c Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c?rev=806663&r1=806662&r2=806663&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c Fri Aug 21 18:13:55 2009 @@ -67,10 +67,10 @@ ACR_DECLARE(int) ACR_Initialize(JavaVM *vm) { - if (initialized++) - return 0; acr_pvm = vm; + if (initialized++) + return 0; if (pthread_key_create(&acr_thread_key, acr_thread_key_destructor)) return ACR_GET_OS_ERROR(); @@ -90,9 +90,8 @@ void *epp; UNREFERENCED(reserved); - if ((*vm)->GetEnv(vm, &epp, JNI_VERSION_1_4)) { + if ((*vm)->GetEnv(vm, &epp, JNI_VERSION_1_4)) return JNI_ERR; - } if (ACR_Initialize(vm)) { /* Error during our init phase */ return JNI_ERR; Modified: commons/sandbox/runtime/trunk/src/main/native/test/testsuite.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/test/testsuite.c?rev=806663&r1=806662&r2=806663&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/test/testsuite.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/test/testsuite.c Fri Aug 21 18:13:55 2009 @@ -140,6 +140,101 @@ return 0; } +static jint (JNICALL *jni_GetDefaultJavaVMInitArgs)(void *) = NULL; +static jint (JNICALL *jni_CreateJavaVM)(JavaVM **, void **, void *) = NULL; +static jint (JNICALL *jni_GetCreatedJavaVMs)(JavaVM **, jsize, jsize *) = NULL; + +/* Call with something like: + * ./testsuite -t jvm -- /opt/java/jre/lib/amd64/server/libjvm.so \ + * -Djava.class.path=../../../dist/bin/java org/apache/commons/runtime/Main + */ +int test_runjvm(int argc, const char *const argv[]) +{ + const char *jvmso; + const char *jvmcp; + const char *jvmmc = NULL; + int dso; + int i; + JavaVMInitArgs in_args; + JavaVMOption options[8]; + JavaVMInitArgs vm_args; + JavaVM *jvm; + JNIEnv *_E; + void *env; + jclass mc; + jobject mo; + jmethodID mm; + + if (argc < 3) + return 22; + jvmso = argv[0]; + jvmcp = argv[1]; + + dso = ACR_DsoLoad(NULL, jvmso); + if (dso < 0) { + fprintf(stderr, "Cannot load JVM from %s\n", jvmso); + fflush(stderr); + return 1; + } + fprintf(stdout, "Using JVM `%s\'\n", jvmso); + + jni_GetDefaultJavaVMInitArgs = ACR_DsoSym(NULL, dso, + "JNI_GetDefaultJavaVMInitArgs"); + jni_CreateJavaVM = ACR_DsoSym(NULL, dso, + "JNI_CreateJavaVM"); + jni_GetCreatedJavaVMs = ACR_DsoSym(NULL, dso, + "JNI_GetCreatedJavaVMs"); + if (!jni_GetDefaultJavaVMInitArgs || !jni_CreateJavaVM || + !jni_GetCreatedJavaVMs) { + fprintf(stderr, "Cannot load JVM symbols from %s\n", jvmso); + fflush(stderr); + return 2; + + } + in_args.version = JNI_VERSION_1_4; + if (jni_GetDefaultJavaVMInitArgs(&in_args) != JNI_OK) { + fprintf(stderr, "Cannot load default VM args from %s\n", jvmso); + fflush(stderr); + return 3; + } + options[0].optionString = (char *)jvmcp; + vm_args.options = options; + vm_args.nOptions = 1; + vm_args.ignoreUnrecognized = JNI_TRUE; + vm_args.version = in_args.version; + + for (i = 2; i < argc; i++) { + if (*argv[i] == '-') + options[vm_args.nOptions++].optionString = (char *)argv[i]; + else + jvmmc = argv[i]; + } + if (jni_CreateJavaVM(&jvm, &env, + &vm_args) != JNI_OK) { + fprintf(stderr, "Failed creating JVM\n"); + fflush(stderr); + return 2; + + } + _E = (JNIEnv *)env; + mc = (*_E)->FindClass(_E, jvmmc); + if (!mc) { + fprintf(stderr, "Cannot find Main class %s\n", jvmmc); + fflush(stderr); + return 2; + } + mo = (*_E)->NewGlobalRef(_E, mc); + mm = (*_E)->GetStaticMethodID(_E, mo, "main", "([Ljava/lang/String;)V"); + if (!mc) { + fprintf(stderr, "Cannot find main method %s\n", jvmmc); + fflush(stderr); + return 2; + } + (*_E)->CallStaticVoidMethod(_E, mc, mm, NULL); + return 0; +} + + int main(int argc, const char *const argv[]) { int rv = 0; @@ -193,6 +288,9 @@ else if (!strcasecmp(run_test, "mktemp")) { rv = test_mktemp(argc, argv); } + else if (!strcasecmp(run_test, "jvm")) { + rv = test_runjvm(argc, argv); + } } cleanup: