On Tue, Sep 9, 2008 at 7:44 PM, John W. Eaton <[EMAIL PROTECTED]> wrote: > On 5-Sep-2008, David Bateman wrote: > > | David Bateman wrote: > | > MartinHepperle wrote: > | >> Hello all, > | >> > | >> again this nasty Java -> Octave connection. > | >> > | >> I also want to embed Octave into a Java program and call Octave > | >> functions > | >> from Java. > | >> > | >> Initially I started with programming an execution engine which starts > | >> octave.exe and connected to its standard input and output pipes. This > | >> concept works (in the meantime I also found two solutions which > | >> implement > | >> the same technique) but is somewhat ugly and inefficient due to > | >> conversions > | >> to and from strings > | >> > | >> What I tried now was to call the Octave DLLs (Windows platform) > | >> directly via > | >> a C wrapper and using JNI. > | >> This technique provides a very elegant solution and I have used this > | >> in the > | >> past to call C and FORTRAN codes from Java. I want to define some global > | >> variables, set the values from Java, execute some user supplied > | >> functions > | >> and finally return the results (global variables set inside the user > | >> functions) to Java. > | >> > | >> Now with the Octrave DLLs I stumbled across a problem. > | >> > | >> To study the interface to ther DLLs I started with a C++ program. > | >> Basically I used the following logic: > | >> > | >> //----------------------------- > | >> // start and initialize Octave (once, then keep it alive) > | >> char * pArgs[] = {"octave.exe","--path", "C:\\Programme\\Octave", > | >> "--norc", > | >> NULL}; > | >> int iRet = octave_main (4 pArgs, true); > | >> > | >> //----------------------------- > | >> // execute some commands > | >> std::string s = std::string("global Output;\nglobal > | >> Input;\nInput=12;\nOutput=2*Input;\n"); > | >> octave_value x = eval_string (s, false, parse_status); > | >> // examine the returned "x" with x.isnumeric() etc. works when code > | >> is in an > | >> executable (.exe) file > | >> > | >> // what does the follwing code do? It works, but where is the > | >> variable in > | >> Octave? > | >> set_global_value (std::string(cName), val); > | >> octave_value vReturn = get_global_value (std::string(cName)); > | >> // the variable has the correct value, but is_globally_visible > | >> (std::string(Name)) returns false... > | >> // what does global mean here? > | >> > | >> > | >> > | >> // terminate Octave > | >> do_octave_atexit(); > | >> //----------------------------- > | >> > | >> All this works well when I have the code inside an executable C++ > | >> program > | >> (MSVC8.0). > | >> > | >> So far so good. > | >> > | >> Now for the interface via JNI I have to put this into a DLL which > | >> provides a > | >> thin layer between Java objects and the C interface to Octave. > | >> If I put the same code inside a DLL I can initialize Octave, but the > | >> eval_string () and other functions doe not work - they seem to do > | >> nothing. I found can do somethings with set_global_value () and > | >> get_global_value (), > | >> but this is not enough and also these "global" values seem to be > | >> something > | >> else than global variables in Octave. > | >> > | >> Anyway, I see that eval_string() seems to work when called from a C > | >> executable, but not when I call it from a DLL. Could this have > | >> something to > | >> do with i/o streams which are different in a DLL and in an EXE? > | >> > | >> Any ideas where to look and how to test? > | >> > | >> > | >> Thank You, > | >> > | >> Martin > | >> > | >> > | >> > | >> > | >> > | > eval_string can only work if the interpreter is initialized.. Check > | > the mailing lists for how to initialize the interpreter. > | > > | > D. > | > > | > > | Seeing as how this question has come up a number of times, I suggest the > | attached changeset that adds an example of how to initialize the > | interpreter and use it from a standalone application. > > I applied it. >
I transplanted this "explanationation" (hg description :-) patch to 3.0.x series -- RNDr. Jaroslav Hajek computing expert Aeronautical Research and Test Institute (VZLU) Prague, Czech Republic url: www.highegg.matfyz.cz ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Octave-dev mailing list Octave-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/octave-dev