简体   繁体   中英

Not able to load rxtx native library with System.load

I'm currently developing on OS X and trying to load the librxtxSerial.jnilib with System.load() , which just doesn't work and always results in

java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver

When I place the lib in /Library/Java/Extensions everything works fine.
I have double checked paths and everything, but it just won't work with System.load when I remove the lib from /Library/Java/Extensions .

I want to bundle the jnilib with a distributable jar, that's why I want to load it programmatically.

Does anybody have an idea?

if you have this:

root:
  main.jar
  libjni.jnilib

And you run your code at the root directory, using command like:

java -jar main.jar

In this case, your loading code should be like:

System.load("libjni.jnilib");

But bot System.loadLibrary(), load is safer than loadLibrary.

It's recommended to pass the absolute path of your jni library to System.load.

I used something like this in my project:

/**
 * To load the JNI library
 * Created by ice1000 on 2017/1/6.
 *
 * @author ice1000
 */
@SuppressWarnings("WeakerAccess")
public final class Loader {
    public final static String JNI_LIB_NAME;
    private static boolean loaded = false;

    /*
     * maybe it's already loaded, so there should be a check
     */
    static {
        JNI_LIB_NAME = "libjni";
        loadJni();
    }

    @NotNull
    @Contract(pure = true)
    private static String libraryName(@NonNls @NotNull String libName) {
        String ___ = System.getProperty("os.name");
        String fileName;
        if (___.contains("Linux"))
            fileName = libName + ".so";
        else if (___.contains("Windows"))
            fileName = libName + ".dll";
        else // if (___.get("OSX"))
            fileName = libName + ".dylib";
//      else fileName = libName;
        return new File(fileName).getAbsolutePath();
    }

    public static void loadJni() {
        if (!loaded) {
            System.load(libraryName(JNI_LIB_NAME));
            loaded = true;
        }
    }
}

here's my working directory:

root:
  javaClasses.jar
  libjni.dll
  libjni.so
  libjni.dylib

Hope this can help you.

Make sure to put your library on LD_LIBRARY_PATH.

Take a look here for lots of JNI related samples written for macOS/Linux.

http://jnicookbook.owsiak.org

I suggest to start with supper simple Hello world app:

http://jnicookbook.owsiak.org/recipe-No-001/

You can take a look there how to develop with JNI for macOS using standard tools.

Hope this helps. Have fun with JNI.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM