2

I am trying to use cplex in java using eclipse IDE on Ubuntu 16.4

and I am getting an exception "UnsatisfiedLinkError" as follows Does anybody have an idea how to overcome this exception?

Exception in thread "main" java.lang.UnsatisfiedLinkError: 'void ilog.concert.cppimpl.concert_wrapJNI.swig_module_init()'
at ilog.concert.cppimpl.concert_wrapJNI.swig_module_init(Native Method)
at ilog.concert.cppimpl.concert_wrapJNI.<clinit>(concert_wrapJNI.java:1619)
at ilog.concert.cppimpl.IloEnv.<init>(IloEnv.java:49)
at ilog.opl.IloOplFactory.<init>(IloOplFactory.java:84)
at cplex.Mulprod.main(Mulprod.java:15)

I am using the following example provided by ensta-paris Java version of mulprod.cpp of OPL distrib

import ilog.concert.*; 
import ilog.opl.*;
import ilog.opl.IloCplex;

public class Mulprod {
  static final String DATADIR = ".";

  static public void main(String[] args) throws Exception {
    int status = 127;
    try {
        IloOplFactory.setDebugMode(true);
        IloOplFactory oplF = new IloOplFactory();
        IloOplErrorHandler errHandler = oplF.createOplErrorHandler();
        IloOplModelSource modelSource = oplF.createOplModelSource(DATADIR + "/mulprod.mod");
        IloOplSettings settings = oplF.createOplSettings(errHandler);
        IloOplModelDefinition def = oplF.createOplModelDefinition(modelSource, settings);
        IloCplex cplex = oplF.createCplex();
        cplex.setOut(null);
        IloOplModel opl = oplF.createOplModel(def, cplex);
        IloOplDataSource dataSource = oplF.createOplDataSource(DATADIR + "/mulprod.dat");
        opl.addDataSource(dataSource);
        opl.generate();
        if (cplex.solve()) {
            System.out.println("OBJECTI " + opl.getCplex().getObjValue());
            opl.postProcess();
            opl.printSolution(System.out);
        } else {
            System.out.println("No solution!");
        }
        oplF.end();
        status = 0;
    } catch (IloOplException ex) {
        System.err.println("### OPL excepti " + ex.getMessage());
        ex.printStackTrace();
        status = 2;
    } catch (IloException ex) {
        System.err.println("### CONCERT excepti " + ex.getMessage());
        ex.printStackTrace();
        status = 3;
    } catch (Exception ex) {
        System.err.println("### UNEXPECTED UNKNOWN ERROR ...");
        ex.printStackTrace();
        status = 4;
    }
    System.exit(status);
}
}

my VM arguments in run configuration are

-Djava.library.path=[cplexStudioPath]/cplex/bin/x86-64_linux:[cplexStudioPath]/opl/bin/x86-64_linux
daoud
  • 25
  • 4

1 Answers1

1

You also have to set the LD_LIBRARY_PATH environment variable so that it includes the OPL directory (which you also specified in java.library.path).

Also note that specifying the CPLEX directory in java.library.path is not required. I recommend removing it since you don't want libraries to get loaded from this place. You only want the libraries from the OPL directory (the required CPLEX libraries are there as well).

Daniel Junglas
  • 5,830
  • 1
  • 5
  • 22
  • Thanks, I don't get that exception anymore, but currently, I am getting java.lang.IncompatibleClassChangeError: class ilog.concert.cppimpl.IloAddNumVar can not implement ilog.concert.IloColumn, because it is not an interface (ilog.concert.IloColumn is in unnamed module of loader 'app') – daoud Jul 08 '20 at 15:08
  • That is weird. Do you have multiple installations of CPLEX? Or is maybe one of your jars corrupted? Which jars do you use? The only thing you should need is `oplall.jar`. – Daniel Junglas Jul 09 '20 at 15:06