Загрузка .so файла Linux во время выполнения Java - PullRequest
7 голосов
/ 09 ноября 2011

Я пытаюсь загрузить Linux-файл .so во время выполнения на Java, но получаю UnsatisfiedLinkError. Я передаю аргумент -Djava.library.path = / Users / tom / codebase / jni / dist VM, когда запускаю основную версию Java из моего класса Test.class. Файл libSample.so находится в каталоге / Users / tom / codebase / jni / dist. Есть идеи? Спасибо!

public class Test {

    public static void main(String[] args) {
        System.out.println(System.getProperty("java.library.path")); 
                //prints /Users/tom/codebase/jni/dist
        System.loadLibrary("Sample");
    }

}

VM Аргумент:

-Djava.library.path=/Users/tom/codebase/jni/dist

Исключение:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no Sample in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1758)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1045)
at Test.main(Test.java:9)

Я также попытался использовать попытку прямого подхода (используя System.load) и получил следующие результаты, если они помогают любому исключению в потоке "main" java.lang.UnsatisfiedLinkError: / Users / tom / codebase / jni / dist / libSample.so: подходящее изображение не найдено. Обнаружил: /Users/tom/codebase/jni/dist/libCiscoEnergyWiseJni.so: неизвестный тип файла, первые восемь байтов: 0x7F 0x45 0x4C 0x46 0x01 0x01 0x01 0x00

Ответы [ 4 ]

10 голосов
/ 09 ноября 2011

Библиотеки в Linux часто называют по шаблону libXXX.so, и я считаю, что Java следует этому соглашению.Так что System.loadLibrary("Sample") может искать libSample.so.Вы можете убедиться в этом, сделав программу быстрого тестирования для вызова System.mapLibraryName и проверив вывод.

Чтобы решить проблему, предполагая, что это на самом деле ваша проблемаможете либо переименовать файл вашей библиотеки, либо использовать System.load (не System.loadLibrary), что загрузит библиотеку, указанную в точном имени файла, который вы ей передали, без каких-либо преобразований.Однако последний метод не переносим между платформами.

0 голосов
/ 27 октября 2016

Я столкнулся с той же проблемой в Linux и решил, установив переменную LD_LIBRARY_PATH

export LD_LIBRARY_PATH=<Lib File Path>:$LD_LIBRARY_PATH.

Надеюсь, это поможет

0 голосов
/ 05 ноября 2014
public class Demo 
{
    static
    {
        try 
        {
            System.load("/home/libsofile.so");
        }
        catch (UnsatisfiedLinkError e) 
        {
            System.err.println("Native code library failed to load.\n" + e);
            System.exit(1);
        }
    }
}
0 голосов
/ 28 декабря 2011

Попробуйте использовать

Runtime.getRuntime().load(resource);
...