Как я должен загрузить собственные библиотеки для JNI для ухода от UnsatisfiedLinkError?

ONELINER:

let ext = (filename.match(/\.([^.]*?)(?=\?|#|$)/) || [])[1] 

выше решение включает ссылки. Например, (filename -> ext):

// "abcd.Ef1"               -> "Ef1"
// "abcd.efg"               -> "efg"
// "abcd.efg?aaa&a?a=b#cb"  -> "efg"
// "abcd.efg#aaa__aa?bb"    -> "efg"
// "abcd"                   -> undefined
// "abcdefg?aaa&aa=bb"      -> undefined
// "abcdefg#aaa__bb"        -> undefined

Он принимает все, что находится между последней точкой и первым символом [? »или« # »или концом строки. Чтобы игнорировать символы «?» и «#», используйте /\.([^.]*)$/. Чтобы игнорировать только «#», используйте /\.([^.]*?)(?=\?|$)/.

16
задан Paŭlo Ebermann 26 September 2011 в 15:19
поделиться

4 ответа

Согласно Pax, вы должны указать путь к библиотеке, где Java должна искать библиотеку. Имя вашей библиотеки должно быть libhello.so. В этом случае вызов для загрузки библиотеки должен быть следующим:

System.loadLibrary("hello");

Библиотеки Linux упоминаются по соглашению lib имя .so и загружаются по имени. Вот ссылка о проблемах динамического связывания в Java из документации SWIG, хотя вы не используете SWIG, этот раздел все еще актуален.

23
ответ дан 30 November 2019 в 15:35
поделиться

Вы неправильно вызываете System.loadLibrary () . Метод loadLibrary принимает имя библиотеки, например «привет», и пытается загрузить соответствующий общий объект. В Unix он попытается загрузить "libhello.so", а в Windows - "hello.dll". Он будет ожидать, что файл будет найден в java.library.path .

Метод, который вы, вероятно, собираетесь вызвать, - это System.load () , который принимает полное имя файла и загружает его. Этот метод должен принимать в качестве аргумента File , но вместо этого он принимает строку. Если вы используете load , вам придется обрабатывать локальные соглашения об именах вручную, но вам не придется полагаться на java.library.path для установки.

15
ответ дан 30 November 2019 в 15:35
поделиться

И запускаете ли вы его с чем-то вроде:

java -Djava.library.path=/home/gavin/Work/workspace/JNI Hello

Вам нужно убедиться, что общий объект находится в пути к вашей библиотеке.

5
ответ дан 30 November 2019 в 15:35
поделиться

Сделайте следующее:

  1. измените свой класс Java на следующий:

    class Hello {
    
     public native void sayHello();
    
     static {
     System.loadLibrary("hello");
     }
    
     public static void main(String[] args) {
     Hello h = new Hello();
     h.sayHello();
     }
    }
    
  2. переименуйте hello.so в libhello.so: cp hello.so libhello.so или mv hello.so libhello.so

  3. запустить как: java -Djava.library.path=/home/gavin/Work/workspace/JNI/ Hello

6
ответ дан 30 November 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: