octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Changeset] Re: [OctDev] Java calling Octave via JNI


From: John W. Eaton
Subject: [Changeset] Re: [OctDev] Java calling Octave via JNI
Date: Tue, 09 Sep 2008 13:44:11 -0400

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.

Thanks,

jwe


reply via email to

[Prev in Thread] Current Thread [Next in Thread]