bturner1273
bturner1273

Reputation: 710

java unable to find native libraries on java.library.path

So I am trying to run a very simple java program that uses IBM CPLEX on a mac. The program recognizes the JAR file but cannot seem to find the native implementations no matter where I point to it.

The Java Program:

import ilog.cplex.IloCplex;

public class CPLEXTester {
    public static void main(String[] args) {
        System.out.println(System.getProperty("java.library.path"));
        try {
            new IloCplex();
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

Output in intellij:

/Users/bradley/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home/bin/java -Dvisualvm.id=27090629736541 -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=63865:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/bradley/Desktop/code/cplexTester/out/production/cplexTester:/Users/bradley/Desktop/code/adaje/code/lib/java/cplex-12.9.jar CPLEXTester
/Users/bradley/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
java.lang.UnsatisfiedLinkError: no cplex1290 in java.library.path: /Users/bradley/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
java.library.path must point to the directory containing the CPLEX shared library
try invoking java with java -Djava.library.path=...
Exception in thread "main" java.lang.UnsatisfiedLinkError: 'long ilog.cplex.Cplex.CPXopenCPLEX(int[])'
    at ilog.cplex.Cplex.CPXopenCPLEX(Native Method)
    at ilog.cplex.CplexI.init(CplexI.java:7083)
    at ilog.cplex.CplexI.<init>(CplexI.java:856)
    at ilog.cplex.IloCplex.<init>(IloCplex.java:12042)
    at ilog.cplex.IloCplex.<init>(IloCplex.java:12057)
    at CPLEXTester.main(CPLEXTester.java:7)

The CPLEX native library location I am trying to use is /Library/Java/Extensions. As can be seen below I have both libcplex1290.jnilib as well as libcplex1290.dylib in the directory: /Library/Java/Extensions listed

Java just keeps throwing UnsatisfiedLinkError(s). When I explicitly try to link and run the below command in zsh I get the same output:

java -Djava.library.path=/Library/Java/Extensions -cp ~/Desktop/code/lib/java/cplex-12.9.jar CPLEXTester.java

Another interesting note is that when I try to load the library i.e.:

public class CPLEXTester {
    public static void main(String[] args) {
        System.load("/Library/Java/Extensions/libcplex1290.jnilib");
    }
}

I get another UnsatisfiedLinkError:

/Users/bradley/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home/bin/java -Dvisualvm.id=27158373972541 -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=63876:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/bradley/Desktop/code/cplexTester/out/production/cplexTester:/Users/bradley/Desktop/code/adaje/code/lib/java/cplex-12.9.jar CPLEXTester
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: /Library/Java/Extensions/libcplex1290.jnilib
    at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2398)
    at java.base/java.lang.Runtime.load0(Runtime.java:785)
    at java.base/java.lang.System.load(System.java:1979)
    at CPLEXTester.main(CPLEXTester.java:5)

Does anyone have any ideas on how this can be resolved? Thank you in advance!

This is my 'About This Mac':

About my mac

Java base settings:

java -XshowSettings:properties -version
Property settings:
    file.encoding = UTF-8
    file.separator = /
    ftp.nonProxyHosts = local|*.local|169.254/16|*.169.254/16
    http.nonProxyHosts = local|*.local|169.254/16|*.169.254/16
    java.class.path = 
    java.class.version = 62.0
    java.home = /Users/bradley/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home
    java.io.tmpdir = /var/folders/6w/qsmx4xpn7vs528v_7qvm_k9m0000gq/T/
    java.library.path = /Users/bradley/Library/Java/Extensions
        /Library/Java/Extensions
        /Network/Library/Java/Extensions
        /System/Library/Java/Extensions
        /usr/lib/java
        .
    java.runtime.name = OpenJDK Runtime Environment
    java.runtime.version = 18.0.1.1+2-6
    java.specification.name = Java Platform API Specification
    java.specification.vendor = Oracle Corporation
    java.specification.version = 18
    java.vendor = Oracle Corporation
    java.vendor.url = https://java.oracle.com/
    java.vendor.url.bug = https://bugreport.java.com/bugreport/
    java.version = 18.0.1.1
    java.version.date = 2022-04-22
    java.vm.compressedOopsMode = Zero based
    java.vm.info = mixed mode, sharing
    java.vm.name = OpenJDK 64-Bit Server VM
    java.vm.specification.name = Java Virtual Machine Specification
    java.vm.specification.vendor = Oracle Corporation
    java.vm.specification.version = 18
    java.vm.vendor = Oracle Corporation
    java.vm.version = 18.0.1.1+2-6
    jdk.debug = release
    line.separator = \n 
    native.encoding = UTF-8
    os.arch = aarch64
    os.name = Mac OS X
    os.version = 12.4
    path.separator = :
    socksNonProxyHosts = local|*.local|169.254/16|*.169.254/16
    sun.arch.data.model = 64
    sun.boot.library.path = /Users/bradley/Library/Java/JavaVirtualMachines/openjdk-18.0.1.1/Contents/Home/lib
    sun.cpu.endian = little
    sun.io.unicode.encoding = UnicodeBig
    sun.java.launcher = SUN_STANDARD
    sun.jnu.encoding = UTF-8
    sun.management.compiler = HotSpot 64-Bit Tiered Compilers
    sun.stderr.encoding = UTF-8
    sun.stdout.encoding = UTF-8
    user.country = US
    user.dir = /Users/bradley
    user.home = /Users/bradley
    user.language = en
    user.name = bradley

openjdk version "18.0.1.1" 2022-04-22
OpenJDK Runtime Environment (build 18.0.1.1+2-6)
OpenJDK 64-Bit Server VM (build 18.0.1.1+2-6, mixed mode, sharing)

Upvotes: 0

Views: 748

Answers (1)

TimChippingtonDerrick
TimChippingtonDerrick

Reputation: 2072

Looks like you are running on Apple M1 silicon. I don't think CPLEX has a port for that proessor yet. Given that CPLEX 12.9 was released in 2019, and pre-dates the announcement of the Apple M1 chips by a year, I'm pretty sure that CPLEX 12.9 won't run natively on an M1.

A quote from the IBM community site says:

We support only intel chip on Mac, not the M1 arm64 chip. So to make CPLEX work on your machine, you have to ask it to use the emulated intel mode via "arch -x86_64 make", "arch -x86_64 gcc" ...

Upvotes: 2

Related Questions