Я пытаюсь заставить работать простой пример JNI, но независимо от того, что я делаю, я не могу заставить его работать с помощью команды loadLibrary.Это прекрасно работает, если я указываю абсолютный путь к файлу .so и использую System.load вместо System.loadLibrary.
Вот мое дерево каталогов:
.
|-- -
|-- TranslatorWrapper.c
|-- TranslatorWrapper.class
|-- TranslatorWrapper.cpp
|-- TranslatorWrapper.h
|-- TranslatorWrapper.java
`-- libTranslatorWrapper.so
Вот Javaкод:
public class TranslatorWrapper {
public native String translate(byte[] bytes);
public static void main(String[] args) {
TranslatorWrapper w = new TranslatorWrapper();
System.out.println("From JNI: " + w.translate(null));
}
static {
System.out.println("Attempting to load library from " + System.getProperty("java.library.path"));
System.loadLibrary("TranslatorWrapper");
//System.load("/path/to/example/libTranslatorWrapper.so");
}
}
Я знаю, что файл .so должен находиться в папке java.library.path, поэтому я запускаю программу с аргументами
java TranslatorWrapper -Djava.library.path=.
, поскольку библиотеканаходится в том же каталоге, что и файл .class.Однако, похоже, что значение игнорируется:
Attempting to load library from .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
Exception in thread "main" java.lang.UnsatisfiedLinkError: no TranslatorWrapper in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1754)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1045)
at TranslatorWrapper.<clinit>(TranslatorWrapper.java:14)
Обратите внимание, что переменная java.library.path не была изменена моим аргументом командной строки.
Я также знаю, что вы вызываетеloadLibrary
с другими аргументами, которые вы вводите load
(в частности, удаление префикса lib и суффикса .so);как вы можете видеть в коде, я уже делаю это.Независимо от того, что файл .so находится в текущем каталоге, что текущий каталог находится на java.library.path, и что я вызываю loadLibrary так, как я видел, он сказал онлайн, ничего из этого не работает.
Есть идеи, что я делаю не так?