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
Он принимает все, что находится между последней точкой и первым символом [?
»или« #
»или концом строки. Чтобы игнорировать символы «?
» и «#
», используйте /\.([^.]*)$/
. Чтобы игнорировать только «#
», используйте /\.([^.]*?)(?=\?|$)/
.
Согласно Pax, вы должны указать путь к библиотеке, где Java должна искать библиотеку. Имя вашей библиотеки должно быть libhello.so. В этом случае вызов для загрузки библиотеки должен быть следующим:
System.loadLibrary("hello");
Библиотеки Linux упоминаются по соглашению lib имя .so и загружаются по имени. Вот ссылка о проблемах динамического связывания в Java из документации SWIG, хотя вы не используете SWIG, этот раздел все еще актуален.
Вы неправильно вызываете System.loadLibrary ()
. Метод loadLibrary
принимает имя библиотеки, например «привет», и пытается загрузить соответствующий общий объект. В Unix он попытается загрузить "libhello.so", а в Windows - "hello.dll". Он будет ожидать, что файл будет найден в java.library.path
.
Метод, который вы, вероятно, собираетесь вызвать, - это System.load ()
, который принимает полное имя файла и загружает его. Этот метод должен принимать в качестве аргумента File
, но вместо этого он принимает строку. Если вы используете load
, вам придется обрабатывать локальные соглашения об именах вручную, но вам не придется полагаться на java.library.path
для установки.
И запускаете ли вы его с чем-то вроде:
java -Djava.library.path=/home/gavin/Work/workspace/JNI Hello
Вам нужно убедиться, что общий объект находится в пути к вашей библиотеке.
Сделайте следующее:
измените свой класс Java на следующий:
class Hello {
public native void sayHello();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
Hello h = new Hello();
h.sayHello();
}
}
переименуйте hello.so в libhello.so:
cp hello.so libhello.so
или mv hello.so libhello.so
запустить как: java -Djava.library.path=/home/gavin/Work/workspace/JNI/ Hello