Я искал ответ на этот вопрос (здесь и на других сайтах) и не нашел подходящего решения. Поэтому я выкладываю вопрос здесь:
Мне нужно обернуть некоторый код C классом Java, используя JNI в Linux.
Имя C dso в linux - at_base.so, а не lib at_base.so, это по историческим причинам, и я предпочитаю не менять имя dso, хотя я добавил несколько новых методов, которые будут использоваться классом Java (как нативные методы, вызываемые JNI).
Я попытался загрузить DSO, используя полный путь DSO, как это:
{
File f = new File("/opt/my_company/my_product/lib/at_base.so");
System.out.println(f.getAbsoluteFile() + " exists = " + f.exists() );
System.load(f.getAbsolutePath());
}
Запуск этого файла показывает, что dso at_base.so существует, но загрузка не удалась, что приводит к ошибке UnsatisfiedLink. Здесь нет проблем с путями, так как если я добавлю символическую ссылку lib at_base.so, которая указывает на at_base.so (в том же каталоге /opt/.../lib), это решит проблему. Кажется, что хотя я предоставляю полный путь dso к java "/opt/my_company/my_product/lib/at_base.so", он все равно пытается загрузить lib at_base.so по указанному пути.
Мой вопрос: есть ли способ заставить Java загружать dso, давая ему точное имя, без необходимости иметь имя библиотеки, начинающееся с lib .