Verfasst am: 13.07.2010, 13:43
Titel: Aufruf von MATLAB über java und C
Hi Leute,
ich bräuchte mal nen Schubser in die richtige Richtung. Ich habe ne direkte JAVA Anbindung an MATLAB seit geraumer Zeit mit der Hilfe des JMI hinbekommen.
Nun wollte ich das ganze über die weit aus häufiger benutzte Methode versuchen. Hierbei wollte ich C über JNI ansprechen.
Hierzu gibt es ja Reichlich Stoff im Netz, aber ich kriegs einfach nicht hin!!!
Kurz zum Ablauf:
Ich habe folgende Vorlage (C-Datei), die es auch bei Mathworks gibt:
Dies kann ich in VSC++ zu einer dll kompilieren und will es über mein Java Programm aufrufen. Dies ist ebenfalls eine Vorlage! Ich lass mal die Kommentare drin!
Code:
Main Methode:
package main;
import MatlabNativeInterface.*;
import java.io.*;
/**
* Demonstration program for connecting Java with Matlab using the Java
* Native Interface (JNI). Wrapper functions access Matlab via Matlab's
* native C Engine library.
**/
public class Main {
public static void main(String[] args){
Engine engine = new MatlabNativeInterface.Engine();
try{
// Matlab start command:
engine.open("matlab -nosplash -nojvm");
// Display output:
System.out.println(engine.getOutputString(500));
// Example: Solve the system of linear equations Ax = f with
// Matlab's Preconditioned Conjugate Gradients method.
engine.evalString("A = gallery('lehmer',10);"); // Define Matrix A
engine.evalString("f = ones(10,1);"); // Define vector f
engine.evalString("pcg(A,f,1e-5)"); // Compute x
//engine.evalString("a =1+2;");
// Retrieve output:
System.out.println(engine.getOutputString(500));
// Close the Matlab session:
engine.close();
} catch(Exception e){
e.printStackTrace();
} } }
/**
* <b>Java Engine for Matlab via Java Native Interface (JNI)</b><br>
* This class demonstrates how to call Matlab from a Java program via
* JNI, thereby employing Matlab as the computation engine.
* The Matlab engine operates by running in the background as a separate
* process from your own program.
* <p>
* Date: 04.04.03
* <p>
* Copyright (c)2003 Andreas Klimke, Universit�t Stuttgart
* <p>
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* <p>
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* <p>
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FORANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* @author W. Andreas Klimke, University of Stuttgart
* (klimke@ians.uni-stuttgart.de)
* @version0.1
*
*/
public class Engine {
/**
* Calls the function <code>engOpen</code> of Matlab's C Engine library.
* Excerpts from the Matlab documentation:
* "On UNIX systems, if startcmd isNULL or the empty string,
* <code>engOpen</code> starts MATLAB on the current host using the
* command <code>matlab</code>. If startcmd is a hostname, <code>engOpen
* </code> starts MATLAB on the designated host by embedding the specified
* hostname string into the larger string:
* <code>rsh hostname \"/bin/csh -c 'setenv DISPLAY\ hostname:0; matlab'\"
* </code>. If startcmd isany other string (has white space in it, or
* nonalphanumeric characters), the string is executed literally to start
* MATLAB. On Windows, the startcmd string must be NULL."<br>
* See the Matlab documentation, chapter "External Interfaces/API
* Reference/C Engine Functions" for further information.
* @param startcmd The start command string.
* @throws IOException Thrown if starting the process was not successful.
*/
public native void open(String startcmd) throws IOException;
/**
* Calls the function <code>engClose</code> of Matlab's C Engine
* library. This routine allows you to quit a MATLAB engine session.
* @throws IOException Thrown if Matlab could not be closed.
*/
public native void close() throws IOException;
/**
* Calls the function <code>engEvalString</code> of Matlab's C Engine
* library. Evaluates the expression contained in string for the MATLAB
* engine session previously started by <code>open</code>.
* See the Matlab documentation, chapter "External Interfaces/API
* Reference/C Engine Functions" for further information.
* @param str Expression to be evaluated.
* @throws IOException Thrown if data could not be sent to Matlab. This
* may happen if Matlab is no longer running.
* @see #open
*/
public native void evalString(String str) throws IOException;
/**
* Reads a maximum of <code>numberOfChars</code> characters from
* the Matlab output buffer and returns the result as String.<br>
* If the number of available characters exceeds <code>numberOfChars</code>,
* the additional data is discarded. The Matlab process must be opended
* previously with <code>open()</code>.<br>
* @return String containing the Matlab output.
* @see #open
* @throws IOException Thrown if data could not be received. This may
* happen if Matlab is no longer running.
*/
public native String getOutputString(int numberOfChars);
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.