<octave-dev ML added in To:> martin.heppe...@dlr.de wrote:
> Hello Philip, > <snip> In terms of methods I always used the object.method (dot) notation. Same here, but sometimes I didn't know how to avoid javaMethod / java_invoke, usually when Java objects/classes have no explicit constructor but only a method "createSomething()". Especially JExcelAPI (for Excel I/O) has lots of these. > It surely would be good if you could repair this bug. I think I did simply > copy the existing java_invoke method and renamed the copy javaMethod. I had > planned to revise this later so that javaMethod just calls java_invoke. This > would remove the duplication of code. The same duplication edists for > java_new and javaObject. I had a look. Currently it is beyond me, but I'll gaze /stare at the code some more and I'm sure then at some moment enlightenment will come automagically :-) Well, at least, that's the way it often worked for me. But just to be sure, I'll copy the part of __java__.cc below for hints. Fixing the doc string is a breeze (I'll do that later), fixing the argument order seems more involved... See my proposed # Change into....# ?? commments. Do you think these changes would be OK? <snip> > I also see that javaMethod in Matlab can be used in two ways to call static > as well as instance methods. Not sure whether the javaMethod in Octave can > handle these two variants. I used java_invoke on both classes and objects and that worked OK. BTW as regards Matlab's info (quoted below): I think Octave is a bit better than the competition as it seems to not have that stupid 31-chars limit on methods - in the ODS R/W scripts for ODF toolkit I've used several methods directly (w/o java_invoke) with ridiculously long names, e.g. 'setTableNumberColumnsRepeatedAttribute' (38 chars), 'getTableNumberMatrixColumnsSpannedAttribute' (43) or even 'getTableProtectionKeyDigestAlgorithmAttribute' (45!), all of these Just Work. Greetz, & see below for __java__.cc stanza Philip > Thank you for spotting this and best regards, <snip> <QUOTE> > ################### Matlab 2009b online help <snip> > javaMethod('MethodName','ClassName',x1,...,xn) calls the static method > MethodName in the class ClassName, with the argument list x1,...,xn. > javaMethod('MethodName',J,x1,...,xn) calls the nonstatic method MethodName on > the object J, with the argument list x1,...,xn. > Remarks > Use the javaMethod function to: > * > Use methods having names longer than 31 characters. > * > Specify the method you want to invoke at run-time, for example, as > input from an application user. > The javaMethod function enables you to use methods having names longer than > 31 characters. This is the only way you can invoke such a method in the > MATLAB software. For example: </QUOTE> <snip> __java__.cc stanza, watch out for line wrap: DEFUN_DLD (javaMethod, args, , "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {...@var{ret} =} javaMethod (@var{obj}, @var{name}, @var{arg1}, ...)\n\ Invoke the method @var{name} on the Java object @var{obj} with the arguments\n\ @var{arg1}, ... For static methods, @var{obj} can be a string representing the\n\ fully qualified name of the corresponding class. The function returns the result\n\ of the method invocation.\n\ \n\ When @var{obj} is a regular Java object, the structure-like indexing can be used\n\ as a shortcut syntax. For instance, the two following statements are equivalent\n\ \n\ @example\n\ ret = javaMethod (x, \"method1\", 1.0, \"a string\")\n\ ret = x.method1 (1.0, \"a string\")\n\ @end example\n\ \n\ @seealso{java_get, java_set, java_new}\n\ @end deftypefn") { octave_value retval; initialize_java (); if (! error_state) { JNIEnv *current_env = octave_java::thread_jni_env (); if (args.length() > 1) { std::string name = args(1).string_value (); # Change into # std::string name = args(0).string_value (); # ?? if (! error_state) { octave_value_list tmp; for (int i=2; i<args.length (); i++) tmp(i-2) = args(i); if (args(0).class_name () == "octave_java") # Change into # if (args(1).class_name () == "octave_java") # ?? { octave_java *jobj = TO_JAVA (args(0)); # Change into # octave_java *jobj = TO_JAVA (args(1)); # ?? retval = jobj->do_java_invoke (current_env, name, tmp); } else if (args(0).is_string ()) # Change into # else if (args(1).is_string ()) # ?? { std::string cls = args(0).string_value (); # Change into # std::string cls = args(1).string_value (); # ?? retval = octave_java::do_java_invoke (current_env, cls, name, tmp); } else error ("javaMethod: first argument must be a Java object or a string"); } else error ("javaMethod: second argument must be a string"); # Change into # error ("javaMethod: first argument must be a string"); # ?? } else print_usage (); } return retval; } ------------------------------------------------------------------------------ Nokia and AT&T present the 2010 Calling All Innovators-North America contest Create new apps & games for the Nokia N8 for consumers in U.S. and Canada $10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store http://p.sf.net/sfu/nokia-dev2dev _______________________________________________ Octave-dev mailing list Octave-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/octave-dev