Java-wrapped Matlab function: `java` can't load/find `main` sample invoker class

42 Views Asked by At

Java-wrapped Matlab function: java can't load/find main sample invoker class

I'm following a MATLAB example of wrapping a MATLAB function in a Java interface. The sample driver (i.e., invoker of the wrapped function) compiles without errors or any messages, but java says that it can't find/load the main class, i.e., the sample driver.

The MATLAB function to be wrapped is exactly as it is on the web page (and in fact, it comes with the MATLAB installation):

" makesqr.m
"----------
function y = makesqr(x)
y = magic(x);

The sample invoker is extremely simple:

" makesqrSample1.m
"-----------------
% Sample script to demonstrate execution of function y = makesqr(x)
x = 3; % Initialize x here
y = makesqr(x);

Everything is exactly as shown in the webpage. I get all the files described in this file summary.

Things start to depart from expected in the "Install and Implement MATLAB Generated Java Application" section. Step 3 refers to a sample invoker getmagic.java instead of the makesqrSample1.java (automagically generated by MATLAB from makesqrSample1.m above). I assume that this is a typo.

With makesqr.jar and makesqrSample1.java in the same (current working) directory, the following compilation issues no messages or errors.

javac -cp \
"makesqr.jar;C:\Program Files\MATLAB\R2019a\toolbox\javabuilder\jar\javabuilder.jar" \
makesqrSample1.java

This creates makesqrSample1.class in the same folder. Here is the error from execution:

java -cp \
"makesqr.jar;C:\Program Files\MATLAB\R2019a\toolbox\javabuilder\jar\javabuilder.jar" \
makesqrSample1

Error: Could not find or load main class makesqrSample1

I checked that the that auto-generated makesqrSample1.java does have main (see ANNEX below).

This is a minimal example, following the documentation faithfully. What is causing main to not be recognized?


CONTEXTUAL DETAILS

Version output (select details):

MATLAB Version: 9.6.0.1072779 (R2019a)
Operating System: Microsoft Windows 10 Pro Version 10.0 (Build 18362)
Java Version: Java 1.8.0_181-b13 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
MATLAB Compiler     Version 7.0.1 (R2019a)
MATLAB Compiler SDK Version 6.6.1 (R2019a)

Installed JDK:

C:\Program Files\AdoptOpenJDK\jdk-8.0.265.01-hotspot

Since I have MATLAB installed, I didn't get the MATLAB Runtime (and from past experience, it has never been clear how/whether the Runtime is being used when MATLAB is installed). The the problem is occurring right up front finding/loading main.


ANNEX: AUTO-GENERATED makesqrSample1.java

import com.mathworks.toolbox.javabuilder.*;
import makesqr.Class1;

/**
 *
 * Sample driver code that is integrated with a compiled MATLAB function
 * generated by MATLAB Compiler SDK.
 *
 * Refer to the MATLAB Compiler SDK documentation for more
 * information.
 *
 * @see com.mathworks.toolbox.javabuilder.MWArray
 *
 */
public class makesqrSample1 {

    private static Class1 class1Instance;

    private static void setup() throws MWException {
        class1Instance = new Class1();
    }

    /**
     * Sample code for {@link Class1#makesqr(int, Object...)}.
     */
    public static void makesqrExample() {
        MWArray xIn = null;
        MWNumericArray yOut = null;
        Object[] results = null;
        try {
            double xInData = 3.0;
            xIn = new MWNumericArray(xInData, MWClassID.DOUBLE);
            results = class1Instance.makesqr(1, xIn);
            if (results[0] instanceof MWNumericArray) {
                yOut = (MWNumericArray) results[0];
            }
            System.out.println(yOut);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // Dispose of native resources
            MWArray.disposeArray(xIn);
            MWArray.disposeArray(results);
        }
    }

    public static void main(String[] args) {
        try {
            setup();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
        try {
            makesqrExample();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        } finally {
            // Dispose of native resources
            class1Instance.dispose();
        }
    }

}
1

There are 1 best solutions below

0
On

This answer is definitely for the Java newbies. The class path for java needs to include the directory . of the newly-compiled makesqrSample1.class:

java -cp \
"makesqr.jar;C:\Program Files\MATLAB\R2019a\toolbox\javabuilder\jar\javabuilder.jar;." \
makesqrSample1

Running C:\cygwin64\tmp\User.Name\mcrCache9.6\makesq0\makesqr\startup
    8     1     6
    3     5     7
    4     9     2

What I find odd is that this java is a Windows installation, yet it seems to recognize that I'm invoking it from Cygwin, and it creates a working folder in C:\cygwin64\tmp\User.Name.