This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Patch: PR 16923


On Tue, 2005-02-22 at 15:25 -0500, Bryce McKinlay wrote:
> 
> See tromey's comment here. Perhaps we need a test case to ensure that -D 
> is working for compiled binaries?
> 

I attached an updated patch that fixes this.  I tested it locally.  I
would submit the test case but our test framework doesn't have the
ability to compile a binary with specific flags, then run it.

> Can we make the arguments to _Jv_CreateJavaVM and JvCreateJavaVM be 
> JvVMInitArgs*, instead of void*?
> 

Done.

> ... and update the "invocation" section of gcj.texi with the definition 
> of these structs, and some brief documentation.
> 

Done.

Tom

2005-02-22  Thomas Fitzsimmons  <fitzsim@redhat.com>

	PR libgcj/16923
	* gij.cc (main): Remove last_D_option.  Dynamically allocate
	_Jv_Compiler_Properties.
	* jni.cc (JNI_CreateJavaVM): Check JNI version.  Cast args to
	JvVMInitArgs.  Pass args to _Jv_CreateJavaVM and check return
	value.  Move argument parsing code to prims.cc.
	* prims.cc (no_properties): Remove.
	(_Jv_Compiler_Properties): Initialize to NULL.
	(_Jv_Properties_Count): Initialize to 0.
	(parse_verbose_args): New function.
	(parse_init_args): New function.
	(_Jv_CreateJavaVM): Call parse_init_args.
	(_Jv_RunMain): Check return value of _Jv_CreateJavaVM.
	* gcj/cni.h (JvVMOption): New struct.
	(JvVMInitArgs): Likewise.
	(JvCreateJavaVM): Declare vm_args as JvVMInitArgs* rather than
	void*.
	* libjava/gcj/javaprims.h (_Jv_VMOption): New struct.
	(_Jv_VMInitArgs): Likewise.
	* include/java-props.h (_Jv_Properties_Count): Declare.
	* java/lang/natRuntime.cc (insertSystemProperties): Use
	_Jv_Properties_Count in for loop exit condition.
	* testsuite/libjava.jni/jni.exp
	(gcj_invocation_compile_c_to_binary): New procedure.
	(gcj_invocation_test_one): Likewise.
	(gcj_jni_run): Run JNI invocation API tests.
	* testsuite/libjava.jni/invocation/PR16923.c,
	testsuite/libjava.jni/invocation/PR16923.java,
	testsuite/libjava.jni/invocation/PR16923.out: New test.

Index: gcc/java/gcj.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/gcj.texi,v
retrieving revision 1.72
diff -u -r1.72 gcj.texi
--- gcc/java/gcj.texi	6 Feb 2005 20:20:59 -0000	1.72
+++ gcc/java/gcj.texi	23 Feb 2005 00:49:32 -0000
@@ -2110,7 +2110,8 @@
 allowing Java code to call into C++. Several functions, known as the 
 @dfn{invocation API}, are provided to support this.
 
-@deftypefun jint JvCreateJavaVM (void* @var{vm_args})
+@deftypefun jint JvCreateJavaVM (JvVMInitArgs* @var{vm_args})
+
 Initializes the Java runtime. This function performs essential initialization
 of the threads interface, garbage collector, exception handling and other key
 aspects of the runtime. It must be called once by an application with
@@ -2119,8 +2120,37 @@
 once provided it is only called from a single thread.
 The @var{vmargs} parameter can be used to specify initialization parameters 
 for the Java runtime. It may be @code{NULL}.
-This function returns @code{0} upon success, or @code{-1} if the runtime is
-already initialized.
+
+JvVMInitArgs is typedef'd from _Jv_VMInitArgs and JvVMOption is
+typedef'd from _Jv_VMOption:
+
+@example
+struct _Jv_VMOption
+@{
+  // a VM initialization option
+  char* optionString;
+  // extra information associated with this option
+  void* extraInfo;
+@};
+
+struct _Jv_VMInitArgs
+@{
+  // for compatibility with JavaVMInitArgs
+  jint version;
+
+  // number of VM initialization options
+  jint nOptions;
+
+  // an array of VM initialization options
+  struct _Jv_VMOption* options;
+
+  // true if the option parser should ignore unrecognized options
+  jboolean ignoreUnrecognized;
+@};
+@end example
+
+@code{JvCreateJavaVM()} returns @code{0} upon success, or @code{-1} if
+the runtime is already initialized.
 
 @emph{Note:} In GCJ 3.1, the @code{vm_args} parameter is ignored. It may be 
 used in a future release.
Index: gcc/java/jvgenmain.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/jvgenmain.c,v
retrieving revision 1.35
diff -u -r1.35 jvgenmain.c
--- gcc/java/jvgenmain.c	10 Feb 2004 19:12:34 -0000	1.35
+++ gcc/java/jvgenmain.c	23 Feb 2005 00:49:32 -0000
@@ -106,6 +106,7 @@
   /* At this point every element of ARGV from 1 to LAST_ARG is a `-D'
      option.  Process them appropriately.  */
   fprintf (stream, "extern const char **_Jv_Compiler_Properties;\n");
+  fprintf (stream, "extern int _Jv_Properties_Count;\n");
   fprintf (stream, "static const char *props[] =\n{\n");
   for (i = 1; i < last_arg; ++i)
     {
@@ -127,7 +128,21 @@
   fprintf (stream, "extern int %s;\n", mangled_classname);
   fprintf (stream, "int main (int argc, const char **argv)\n");
   fprintf (stream, "{\n");
-  fprintf (stream, "   _Jv_Compiler_Properties = props;\n");
+  fprintf (stream, "   int i = 0;\n");
+  fprintf (stream, "   _Jv_Compiler_Properties = 0;\n");
+  fprintf (stream, "   _Jv_Properties_Count = (sizeof (props) " \
+                   "/ sizeof (const char *)) - 1;\n");
+  fprintf (stream, "   if (_Jv_Properties_Count > 0)\n");
+  fprintf (stream, "     {\n");
+  fprintf (stream, "       _Jv_Compiler_Properties = " \
+                   "(const char**) _Jv_Realloc\n");
+  fprintf (stream, "         (_Jv_Compiler_Properties, " \
+                   "_Jv_Properties_Count);\n");
+  fprintf (stream, "       for (i = 0; i < _Jv_Properties_Count; i++)\n");
+  fprintf (stream, "         {\n");
+  fprintf (stream, "           _Jv_Compiler_Properties[i] = props[i];\n");
+  fprintf (stream, "         }\n");
+  fprintf (stream, "     }\n");
   fprintf (stream, "   JvRunMain (&%s, argc, argv);\n", mangled_classname);
   fprintf (stream, "}\n");
   if (stream != stdout && fclose (stream) != 0)
Index: libjava/gij.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gij.cc,v
retrieving revision 1.25
diff -u -r1.25 gij.cc
--- libjava/gij.cc	18 Feb 2005 20:52:14 -0000	1.25
+++ libjava/gij.cc	23 Feb 2005 00:49:50 -0000
@@ -57,7 +57,6 @@
 {
   /* We rearrange ARGV so that all the -D options appear near the
      beginning.  */
-  int last_D_option = 0;
   bool jar_mode = false;
 
   int i;
@@ -77,7 +76,12 @@
 
       if (! strncmp (arg, "-D", 2))
 	{
-	  argv[last_D_option++] = arg + 2;
+	  _Jv_Compiler_Properties = (const char**) _Jv_Realloc
+	    (_Jv_Compiler_Properties,
+	     (_Jv_Properties_Count + 1) * sizeof (char*));
+
+	  _Jv_Compiler_Properties[_Jv_Properties_Count++] = strdup (arg + 2);
+
 	  continue;
 	}
 
@@ -153,9 +157,6 @@
 	}
     }
 
-  argv[last_D_option] = NULL;
-  _Jv_Compiler_Properties = argv;
-
   if (argc - i < 1)
     {
       fprintf (stderr, "Usage: gij [OPTION] ... CLASS [ARGS] ...\n");
Index: libjava/jni.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni.cc,v
retrieving revision 1.94
diff -u -r1.94 jni.cc
--- libjava/jni.cc	14 Feb 2005 13:51:29 -0000	1.94
+++ libjava/jni.cc	23 Feb 2005 00:49:51 -0000
@@ -2498,7 +2498,16 @@
 {
   JvAssert (! the_vm);
 
-  _Jv_CreateJavaVM (NULL);
+  jint version = * (jint *) args;
+  // We only support 1.2 and 1.4.
+  if (version != JNI_VERSION_1_2 && version != JNI_VERSION_1_4)
+    return JNI_EVERSION;
+
+  JvVMInitArgs* vm_args = reinterpret_cast<JvVMInitArgs *> (args);
+
+  jint result = _Jv_CreateJavaVM (vm_args);
+  if (result)
+    return result;
 
   // FIXME: synchronize
   JavaVM *nvm = (JavaVM *) _Jv_MallocUnchecked (sizeof (JavaVM));
@@ -2506,48 +2515,6 @@
     return JNI_ERR;
   nvm->functions = &_Jv_JNI_InvokeFunctions;
 
-  // Parse the arguments.
-  if (args != NULL)
-    {
-      jint version = * (jint *) args;
-      // We only support 1.2 and 1.4.
-      if (version != JNI_VERSION_1_2 && version != JNI_VERSION_1_4)
-	return JNI_EVERSION;
-      JavaVMInitArgs *ia = reinterpret_cast<JavaVMInitArgs *> (args);
-      for (int i = 0; i < ia->nOptions; ++i)
-	{
-	  if (! strcmp (ia->options[i].optionString, "vfprintf")
-	      || ! strcmp (ia->options[i].optionString, "exit")
-	      || ! strcmp (ia->options[i].optionString, "abort"))
-	    {
-	      // We are required to recognize these, but for now we
-	      // don't handle them in any way.  FIXME.
-	      continue;
-	    }
-	  else if (! strncmp (ia->options[i].optionString,
-			      "-verbose", sizeof ("-verbose") - 1))
-	    {
-	      // We don't do anything with this option either.  We
-	      // might want to make sure the argument is valid, but we
-	      // don't really care all that much for now.
-	      continue;
-	    }
-	  else if (! strncmp (ia->options[i].optionString, "-D", 2))
-	    {
-	      // FIXME.
-	      continue;
-	    }
-	  else if (ia->ignoreUnrecognized)
-	    {
-	      if (ia->options[i].optionString[0] == '_'
-		  || ! strncmp (ia->options[i].optionString, "-X", 2))
-		continue;
-	    }
-
-	  return JNI_ERR;
-	}
-    }
-
   jint r =_Jv_JNI_AttachCurrentThread (nvm, penv, NULL);
   if (r < 0)
     return r;
Index: libjava/prims.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/prims.cc,v
retrieving revision 1.103
diff -u -r1.103 prims.cc
--- libjava/prims.cc	16 Feb 2005 04:16:06 -0000	1.103
+++ libjava/prims.cc	23 Feb 2005 00:49:51 -0000
@@ -80,10 +80,9 @@
 // functions are changed to take a size_t argument instead of jint.
 #define MAX_OBJECT_SIZE ((1<<31) - 1)
 
-static const char *no_properties[] = { NULL };
-
 // Properties set at compile time.
-const char **_Jv_Compiler_Properties = no_properties;
+const char **_Jv_Compiler_Properties = NULL;
+int _Jv_Properties_Count = 0;
 
 // The JAR file to add to the beginning of java.class.path.
 const char *_Jv_Jar_Class_Path;
@@ -909,16 +908,165 @@
   bool runtimeInitialized = false;
 }
 
+static jint
+parse_verbose_args (char* option_string,
+		    bool ignore_unrecognized)
+{
+  size_t len = sizeof ("-verbose");
+
+  if (strlen (option_string) < len)
+    return -1;
+
+  if (option_string[len] == ':'
+      && option_string[len + 1] != '\0')
+    {
+      char* verbose_args = option_string + len + 1;
+      size_t last = 0;
+
+      do
+	{
+	  if (! strncmp (verbose_args,
+			 "gc", (last = sizeof ("gc")) - 1)
+	      && (verbose_args[last] == '\0'
+		  || verbose_args[last] == ','))
+	    {
+	      // FIXME: we should add functions to boehm-gc that
+	      // toggle GC_print_stats, GC_PRINT_ADDRESS_MAP and
+	      // GC_print_back_height.
+
+	    }
+	  else if (! strncmp (verbose_args,
+			      "class",
+			      (last = sizeof ("class")) - 1)
+		   && (verbose_args[last] == '\0'
+		       || verbose_args[last] == ','))
+	    {
+	      gcj::verbose_class_flag = true;
+	    }
+	  else if (! strncmp (verbose_args, "jni",
+			      (last = sizeof ("jni")) - 1)
+		   && (verbose_args[last] == '\0'
+		       || verbose_args[last] == ','))
+	    {
+	      // FIXME: enable JNI messages.
+	    }
+	  else if (ignore_unrecognized
+		   && verbose_args[0] == 'X')
+	    {
+	      // ignore unrecognized non-standard verbose option
+	      last = 0;
+	      while (verbose_args[last] != '\0'
+		     && verbose_args[last++] != ',');
+	    }
+
+	  if (strlen (verbose_args) >= last)
+	    {
+	      if (verbose_args[last] == ',')
+		{
+		  if (verbose_args[last + 1] == '\0')
+		    // trailing comma
+		    return -1;
+		  else
+		    {
+		      verbose_args = verbose_args + last + 1;
+		      last = 0;
+		    }
+		}
+	      // here verbose_args[last] is either '\0' or
+	      // the first character in the next verbose
+	      // argument.
+	    }
+	  else
+	    // partial option
+	    return -1;
+
+	  // verbose_args[last] will be '\0' here if we're
+	  // done.
+	}
+      while (verbose_args[last] != '\0');
+    }
+  else if (option_string[len] == 'g'
+	   && option_string[len + 1] == 'c'
+	   && option_string[len + 2] == '\0')
+    {
+      // FIXME: we should add functions to boehm-gc that
+      // toggle GC_print_stats, GC_PRINT_ADDRESS_MAP and
+      // GC_print_back_height.
+      return 0;
+    }
+  else if (option_string[len] == '\0')
+    {
+      gcj::verbose_class_flag = true;
+      return 0;
+    }
+  else
+    {
+      // unrecognized option beginning with -verbose
+      return -1;
+    }
+  return 0;
+}
+
+static jint
+parse_init_args (JvVMInitArgs* vm_args)
+{
+  if (vm_args == NULL)
+    return 0;
+
+  for (int i = 0; i < vm_args->nOptions; ++i)
+    {
+      char* option_string = vm_args->options[i].optionString;
+      if (! strcmp (option_string, "vfprintf")
+	  || ! strcmp (option_string, "exit")
+	  || ! strcmp (option_string, "abort"))
+	{
+	  // FIXME: we are required to recognize these, but for
+	  // now we don't handle them in any way.
+	  continue;
+	}
+      else if (! strncmp (option_string,
+			  "-verbose", sizeof ("-verbose") - 1))
+	{
+	  jint result = parse_verbose_args (option_string,
+					    vm_args->ignoreUnrecognized);
+	  if (result < 0)
+	    return result;
+	}
+      else if (! strncmp (option_string, "-D", 2))
+	{
+	  _Jv_Compiler_Properties = (const char**) _Jv_Realloc
+	    (_Jv_Compiler_Properties,
+	     (_Jv_Properties_Count + 1) * sizeof (char*));
+
+	  _Jv_Compiler_Properties[_Jv_Properties_Count++] =
+	    strdup (option_string + 2);
+
+	  continue;
+	}
+      else if (vm_args->ignoreUnrecognized)
+	{
+	  if (option_string[0] == '_'
+	      || ! strncmp (option_string, "-X", 2))
+	    continue;
+	}
+    }
+  return 0;
+}
+
 jint
-_Jv_CreateJavaVM (void* /*vm_args*/)
+_Jv_CreateJavaVM (JvVMInitArgs* vm_args)
 {
   using namespace gcj;
-  
+
   if (runtimeInitialized)
     return -1;
 
   runtimeInitialized = true;
 
+  jint result = parse_init_args (vm_args);
+  if (result < 0)
+    return -1;
+
   PROCESS_GCJ_PROPERTIES;
 
   /* Threads must be initialized before the GC, so that it inherits the
@@ -1016,7 +1164,12 @@
       // is initialized.
       if (is_jar)
 	_Jv_Jar_Class_Path = strdup (name);
-      _Jv_CreateJavaVM (NULL);
+
+      if (_Jv_CreateJavaVM (NULL) < 0)
+	{
+	  fprintf (stderr, "libgcj: couldn't create virtual machine\n");
+	  exit (1);
+	}
 
       // Get the Runtime here.  We want to initialize it before searching
       // for `main'; that way it will be set up if `main' is a JNI method.
Index: libjava/gcj/cni.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gcj/cni.h,v
retrieving revision 1.14
diff -u -r1.14 cni.h
--- libjava/gcj/cni.h	12 Aug 2004 06:53:38 -0000	1.14
+++ libjava/gcj/cni.h	23 Feb 2005 00:49:51 -0000
@@ -17,6 +17,7 @@
 #include <java/lang/Class.h>
 
 #include <gcj/array.h>
+#include <gcj/javaprims.h>
 
 #include <string.h>
 
@@ -113,8 +114,11 @@
   return _Jv_Free (ptr);
 }
 
+typedef struct _Jv_VMOption JvVMOption;
+typedef struct _Jv_VMInitArgs JvVMInitArgs;
+
 extern inline jint
-JvCreateJavaVM (void* vm_args)
+JvCreateJavaVM (JvVMInitArgs* vm_args)
 {
   return _Jv_CreateJavaVM (vm_args);
 }
Index: libjava/gcj/javaprims.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gcj/javaprims.h,v
retrieving revision 1.54
diff -u -r1.54 javaprims.h
--- libjava/gcj/javaprims.h	25 Nov 2004 03:46:58 -0000	1.54
+++ libjava/gcj/javaprims.h	23 Feb 2005 00:49:51 -0000
@@ -487,7 +487,30 @@
 extern "C" jsize _Jv_GetStringUTFRegion (jstring, jsize, jsize, char *);
 extern "C" jint _Jv_hashUtf8String (char*, int);
 
-extern jint _Jv_CreateJavaVM (void* /*vm_args*/);
+struct _Jv_VMOption
+{
+  // a VM initialization option
+  char* optionString;
+  // extra information associated with this option
+  void* extraInfo;
+};
+
+struct _Jv_VMInitArgs
+{
+  // for compatibility with JavaVMInitArgs
+  jint version;
+
+  // number of VM initialization options
+  jint nOptions;
+
+  // an array of VM initialization options
+  struct _Jv_VMOption* options;
+
+  // true if the option parser should ignore unrecognized options
+  jboolean ignoreUnrecognized;
+};
+
+extern jint _Jv_CreateJavaVM (struct _Jv_VMInitArgs*);
 
 void
 _Jv_ThreadRun (java::lang::Thread* thread);
Index: libjava/include/java-props.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/include/java-props.h,v
retrieving revision 1.7
diff -u -r1.7 java-props.h
--- libjava/include/java-props.h	21 Aug 2000 06:05:19 -0000	1.7
+++ libjava/include/java-props.h	23 Feb 2005 00:49:52 -0000
@@ -21,6 +21,7 @@
 
 // Set to NULL-terminated list of properties set at compile time.
 extern const char **_Jv_Compiler_Properties;
+extern int _Jv_Properties_Count;
 
 // The JAR file to add to the beginning of java.class.path.
 extern const char *_Jv_Jar_Class_Path;
Index: libjava/java/lang/natRuntime.cc
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/lang/natRuntime.cc,v
retrieving revision 1.46
diff -u -r1.46 natRuntime.cc
--- libjava/java/lang/natRuntime.cc	18 Feb 2005 23:29:44 -0000	1.46
+++ libjava/java/lang/natRuntime.cc	23 Feb 2005 00:49:53 -0000
@@ -557,7 +557,7 @@
   // `-D'.  Important: after this point, the only properties that
   // should be set are those which either the user cannot meaningfully
   // override, or which augment whatever value the user has provided.
-  for (int i = 0; _Jv_Compiler_Properties[i]; ++i)
+  for (int i = 0; i < _Jv_Properties_Count; ++i)
     {
       const char *s, *p;
       // Find the `='.
Index: libjava/testsuite/libjava.jni/jni.exp
===================================================================
RCS file: /cvs/gcc/gcc/libjava/testsuite/libjava.jni/jni.exp,v
retrieving revision 1.17
diff -u -r1.17 jni.exp
--- libjava/testsuite/libjava.jni/jni.exp	21 Dec 2004 01:01:07 -0000	1.17
+++ libjava/testsuite/libjava.jni/jni.exp	23 Feb 2005 00:49:55 -0000
@@ -181,6 +181,85 @@
   return 1
 }
 
+# Compile a single C file and produce a binary.  OPTIONS is a list of
+# options to pass to the compiler.  Returns 0 on failure, 1 on
+# success.
+proc gcj_jni_invocation_compile_c_to_binary {file {options {}}} {
+  global srcdir
+  global host_triplet
+  verbose "options: $options"
+  set options_cxx $options
+  set options ""
+
+  set filename [file tail $file]
+  set name [file rootname $filename]
+
+  # Find jni.h.
+  lappend options "additional_flags=-I$srcdir/../include"
+
+  # Append C++ options
+  lappend options "additional_flags=$options_cxx"
+
+  set x [libjava_prune_warnings \
+	   [target_compile $file $name executable $options]]
+  if {$x != ""} {
+    verbose "target_compile failed: $x" 2
+    fail "$filename compilation"
+    return 0
+  }
+
+  pass "$filename compilation"
+  return 1
+}
+
+# Do all the work for a single invocation API test.  Return 0 on
+# failure.
+proc gcj_jni_invocation_test_one {file} {
+  global runtests
+  global host_triplet
+  global INTERPRETER
+
+  # The base name.  We use it for several purposes.
+  set main [file rootname [file tail $file]]
+  if {! [runtest_file_p $runtests $main]} {
+    # Simply skip it.
+    return 1
+  }
+
+  if {! [bytecompile_file $file [pwd]]} {
+    fail "bytecompile $file"
+    # FIXME - should use `untested' on all remaining tests.
+    # But that is hard.
+    return 0
+  }
+  pass "bytecompile $file"
+
+  set cfile [file rootname $file].c
+  set cxxflags "-lgcj"
+
+  if {! [gcj_jni_invocation_compile_c_to_binary $cfile $cxxflags]} {
+    # FIXME
+    return 0
+  }
+
+  set resultfile [file rootname $file].out
+
+  if {! [gcj_invoke $main $resultfile ""]} {
+    # FIXME
+    return 0
+  }
+
+  # We purposely ignore errors here; we still want to run the other
+  # appropriate tests.
+  set errname [file rootname [file tail $file]]
+
+  # When we succeed we remove all our clutter.
+  eval gcj_cleanup [glob -nocomplain -- ${main}.*] \
+    [list $main]
+
+  return 1
+}
+
 # Run the JNI tests.
 proc gcj_jni_run {} {
   global srcdir subdir
@@ -193,6 +272,13 @@
     foreach x $srcfiles {
       gcj_jni_test_one $x
     }
+
+    # Run JNI invocation API tests
+    catch { lsort [glob -nocomplain ${srcdir}/${subdir}/invocation/*.java] } srcfiles
+
+    foreach x $srcfiles {
+      gcj_jni_invocation_test_one $x
+    }
   } else {
     verbose "JNI tests not run in cross-compilation environment"
   }
Index: libjava/testsuite/libjava.jni/invocation/PR16923.c
===================================================================
RCS file: libjava/testsuite/libjava.jni/invocation/PR16923.c
diff -N libjava/testsuite/libjava.jni/invocation/PR16923.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.jni/invocation/PR16923.c	23 Feb 2005 00:49:55 -0000
@@ -0,0 +1,43 @@
+#include <assert.h>
+#include <jni.h>
+
+union env_union
+{
+  void *void_env;
+  JNIEnv *jni_env;
+};
+
+int
+main (int argc, const char** argv)
+{
+  union env_union tmp;
+  JNIEnv* env;
+  JavaVM* jvm;
+  JavaVMInitArgs vm_args;
+  JavaVMOption options[1];
+  jclass class_id;
+  jmethodID method_id;
+  jint result;
+
+  options[0].optionString = "-DPR16923=optionReceived";
+
+  vm_args.version = JNI_VERSION_1_2;
+  vm_args.ignoreUnrecognized = JNI_TRUE;
+  vm_args.options = options;
+  vm_args.nOptions = 1;
+
+  result = JNI_CreateJavaVM (&jvm, &tmp.void_env, &vm_args);
+  assert (result >= 0);
+
+  env = tmp.jni_env;
+
+  class_id = (*env)->FindClass (env, "PR16923");
+  assert (class_id);
+
+  method_id = (*env)->GetStaticMethodID (env, class_id, "printIt", "()V");
+  assert (method_id);
+
+  (*env)->CallStaticVoidMethod (env, class_id, method_id, NULL);
+
+  return 0;
+}
Index: libjava/testsuite/libjava.jni/invocation/PR16923.java
===================================================================
RCS file: libjava/testsuite/libjava.jni/invocation/PR16923.java
diff -N libjava/testsuite/libjava.jni/invocation/PR16923.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.jni/invocation/PR16923.java	23 Feb 2005 00:49:55 -0000
@@ -0,0 +1,7 @@
+public class PR16923
+{
+  public static void printIt ()
+  {
+    System.out.println (System.getProperty ("PR16923"));
+  }
+}
Index: libjava/testsuite/libjava.jni/invocation/PR16923.out
===================================================================
RCS file: libjava/testsuite/libjava.jni/invocation/PR16923.out
diff -N libjava/testsuite/libjava.jni/invocation/PR16923.out
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ libjava/testsuite/libjava.jni/invocation/PR16923.out	23 Feb 2005 00:49:55 -0000
@@ -0,0 +1 @@
+optionReceived

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]