У меня проблема с Java Native Access: у меня есть C-библиотека с одной функцией, скажем foo(). Эта функция имеет память - счетчик - с увеличением с каждым вызовом. Возможно ли создать два экземпляра этой библиотеки в рамках одного и того же Java-процесса, чтобы счетчики были независимыми?Как создать несколько экземпляров одной и той же библиотеки с помощью JNA?
спасибо.
Вот код:
public class A
{
public static class Lib
{
NativeLibrary libInstance = NativeLibrary.getInstance("myLibrary");
Function fn = lib.getFunction("foo");
}
private Lib lib = new Lib();
public foo()
{
lib.fn.invoke(new Object[] {});
}
}
Если я позвоню:
A a = new A();
A b = new A();
a.foo(); // >1
a.foo(); // >2
b.foo(); // >3
a.foo(); // >4
b.foo(); // >5
a.foo(); // >6
, но я хочу и б работать независимым с библиотекой:
a.foo(); // >1
a.foo(); // >2
b.foo(); // >1
a.foo(); // >3
b.foo(); // >2
a.foo(); // >4
Большое спасибо
Вот как я попытаться создать экземпляр из Lib:
public class DriverLib
{
private static int counter = 1;
NativeLibrary lib;
Function stepAction;
Function initialize;
Function terminate;
Pointer input;
Pointer output;
public DriverLib()
{
// create options
HashMap<String, Integer> options = new HashMap<>();
options.put(Library.OPTION_OPEN_FLAGS, new Integer(counter++));
lib = NativeLibrary.getInstance("mylib_win64", options);
stepAction = lib.getFunction("step");
initialize = lib.getFunction("initialize");
terminate = lib.getFunction("terminate");
input = lib.getGlobalVariableAddress("model_U");
output = lib.getGlobalVariableAddress("model_Y");
}
}
Спасибо за ваш ответ. Проблема в том, что мне нужно динамическое количество экземпляров. Таким образом, опция копирования не является опцией. Другое решение для меня не совсем понятно. Ich установил опцию OPTION_OPEN_FLAGS в HasMap. Единственными возможными значениями являются -1, 0 и 1 (все остальные выбрасывают исключения). Во всяком случае, это не приводит к разным экземплярам библиотеки. Также я установил несколько фиктивных ключей с разными значениями. Также в этом случае я получаю только ту же проблему. – Jens
Включите фактические исключения, возникающие при попытке использовать разные значения OPTION_OPEN_FLAGS, а также специальный метод, используемый для передачи флагов. Этот параметр должен принимать любое целочисленное значение (-1 рассматривается как «по умолчанию»). – technomage
Кажется, это ошибка, данная ОС: Исключение в потоке «main» java.lang.UnsatisfiedLinkError: Falscher Parameter. Это означает «неправильный параметр». Я добавляю код к вопросу выше. – Jens