Рассмотрим MyClass.java:
public class MyClass {
public void firstfunction(double fwd[]) {
fwd[0] = 42;
}
public void secondfunction(Double fwd[]) {
fwd[0] = new Double(42);
}
}
Обе функции возвращают значение 42 в fwd
, верно?
Из MATLAB я хочу получить доступ к этому значению 42:
myobj=MyClass;
var1=0.0;
myobj.firstfunction(var1);
fprintf('%1.1f',var1); %// ... var1 is still 0.0 ... :-(
var2 = javaArray ('java.lang.Double',1);
var2(1)=java.lang.Double(0.0);
myobj.secondfunction(var2); %// var2 now contains the value 42 :-)
Пока оба вызова «работают» (как: без сообщения об ошибке), только var2 содержит возвращаемое значение 42;var1 по-прежнему имеет значение 0.0.
Можно ли использовать MATLAB для вызова функции firstfunction
и получения возвращаемого значения?
Некоторый фон: MATLAB может передавать объекты Java при вызове функции Java, и впоследствии эти модификации доступны в MATLAB - , за исключением , когда объект Java является массивом примитивного типа данных.В этом случае происходит автоматическое преобразование между MATLAB и Java, в результате чего массив Java-массива-примитива-двойника напрямую соответствует двойной матрице в MATLAB - что в соответствии с соглашениями MATLAB вещь «передается как значение», поэтому возвращаемые значения невозможны.Так что мой вопрос можно перефразировать как , есть ли способ обойти это?
(вы можете перестать читать здесь.)
Для справки, мой особый случай был таким:
У меня есть класс Java MyClass.java, обертывающий DLL, которую я хочу использовать в MATLAB.Однако возвращаемое значение одной из функций - это double [], передаваемый в качестве параметра , содержимое которого не возвращает его обратно в MATLAB из-за того, как взаимодействует с Java
Есть ли способ обойти эту проблему, не изменяя способ, которым DLL возвращает данные?
Вот ужасные детали:
public class MyClass
{
static
{
System.load("C:\\fullpath\\mydll.dll");
}
public static native long SetFWD(double fwd);
public static native long GetFWD(double fwd[]);
}
Этовидимый из MATLAB, как только я правильно установил javapath:
>> methods MyClass -full
Methods for class MyClass:
static long GetFWD(double[])
MyClass()
static long SetFWD(double)
[and stuff inherited from java.lang.Object]
Я могу вызвать функцию SetFWD из MATLAB, но я не могу заставить GetFWD что-либо вернуть:
myobj=MyClass;
fwd=3.0;
myobj.SetFWD(fwdval); % this works fine
fwd=0.0;
myobj.GetFWD(fwd); % this does not give an error, but fwd stays unmodified - as one would expect in MATLAB
fwd = javaArray ('java.lang.Double',1);
fwd(1) = java.lang.Double(0.0);
myobj.GetFWD(fwd) % this gives the error "??? No method 'GetFWD' with matching signature found for class 'MyClass'."
Из чтения документации MATLAB Передача данных в метод Java и Работа с массивами Java , а также сообщения SO Переход от типов Java обратно к типам MATLAB и Странные классы, переданные из matlab в java , я понимаю, что Matlab автоматически преобразует любой двойной массив, который я передаю функции, в массив Java, а затем игнорирует любые изменения, вносимые в эти массивы.Кажется, что если мое определение функции в MyClass содержало объекты Double вместо двойных примитивов, моя вторая попытка могла бы сработать.
Есть ли способ получить MATLAB для возврата значения, которое я ищу, без изменения оригинала.DLL (mydll.dll)?
Обновление
Я понимаю, что MATLAB обычно передает все "по значению".Но в Передача данных в метод Java Mathworks говорит, что
Если вам нужно получить доступ к изменениям, которые метод Java вносит в массив, то вместо передачи массива MATLAB,Вы должны создать и передать массив Java, который является ссылкой.
Они объясняют в Работа с массивами Java , как это сделать с помощью функции javaArray, но я не смогзаставить это работать для создания массива double [] (т. е. массива примитивных двойников), только для Double [] (т. е. массива объектов Double), что здесь не то, что мне нужно, поскольку моя функция GetFWD () неесть последнее: - (.
>> A=javaArray ('java.lang.double',1); % works fine, but cannot be used as parameter for my function GetFWD (see "No Method ... with matching signature..." error above)
>> A=javaArray ('double',1);
??? Error using ==> javaArray
No class double can be located on the MATLAB Java classpath