Вызов Java из MATLAB

Я использовал Swig для создания оболочки Java для библиотеки, написанной на C++. Обертки генерируются в пакет, а затем jar обрабатываются. Файлы скомпилированы правильно и отлично работают с java, но я не могу вызвать его из MATLAB.

Я попытался добавить путь к банке в статический файл пути Java в MATLAB, а затем вызвать классы в файле jar, но я получаю сообщение об ошибке "Undefined variable or class.." или если я пытаюсь использовать javaObject(...) "No class * can be located on Java class path".

Я не уверен, что я делаю неправильно.


РЕДАКТИРОВАТЬ:

Чтобы протестировать вызов библиотеки C++ из MATLAB, я создал простой класс «считывателя данных», который содержит функцию, которая записывает случайно сгенерированное число vector< vector<double> > в текстовый файл, и функцию, которая его считывает.

Сгенерированные файлы swig: SimpleReader.java, DoubleVector.java, exampleJNI.java, example.java, DoubleVector2.java в пакете com.example.reader. Они скомпилированы и упакованы в example.jar (сгенерированная библиотека dll также упакована в банку).

Все это прекрасно работает, вызывая его из java, поэтому проблема должна быть специфичной для MATLAB. Кода для MATLAB не так много, так как ничего не работает. я дохожу до

javaclasspath('c:/reader/reader.jar');
obj = com.example.reader.SimpleReader;

в этот момент я получаю 'Undefined variable "com" or class "com.example.reader.SimpleReader"'


person ssaammuu    schedule 08.08.2011    source источник
comment
Приведите более подробный пример того, какие операторы MATLAB вы выполняете.   -  person Jason S    schedule 08.08.2011


Ответы (1)


В общем, вы должны быть в состоянии сделать это:

javaclasspath('/path/to/myjar.jar')
myobj = com.example.mypackage.MyObject;
myobj.someMethod(123);

Я использую это с MATLAB уже довольно давно, и у меня не было проблем. Возможно, вы могли бы опубликовать точный код MATLAB, который вы используете?


я дохожу до

javaclasspath('c:/reader/reader.jar'); 
obj = com.example.reader.SimpleReader; 

в этот момент я получаю «Неопределенная переменная com или класс com.example.reader.SimpleReader»

Ну, во-первых, вы упомянули, что ваш jar-файл называется example.jar, но ваш код MATLAB ссылается на reader.jar -- вы уверены, что jar-файл, на который вы ссылаетесь в javaclasspath(), существует? Вы не пробовали посмотреть его содержимое? (например, с помощью 7zip или любой программы, которая может читать файлы в формате .zip, поскольку файлы .jar — это просто файлы в формате .zip с дополнительными спецификациями)


Хм...

  • какую версию MATLAB вы используете?

  • ваши занятия публичны?

  • Что вы получаете, когда пытаетесь ввести следующее:

      javap -classpath c:/reader/example.jar com.example.reader.SimpleReader
    

Вы говорите, что используете версию 7.0.4 - скорее всего проблема в этом. В более ранних версиях MATLAB используется старая версия Java JRE:

MATLAB полностью поддерживается только на JVM, который мы поставляем с MATLAB. Например:

JVM 1.3.1 для MATLAB 6.5.1 (R13SP1)

JVM 1.4.2 для MATLAB 7.0.1 (R14SP1)

MATLAB 7.0.4 (R14SP2) и более поздние версии до MATLAB 7.4 (R2007a) используют JVM 1.5 и MATLAB 7.5 (R2007b), а более поздние версии используют JVM 1.6. Есть компоненты, которые могут работать неправильно в другой версии JVM.

У вас в основном есть три варианта на данный момент.

  • (если возможно) -- используйте только файлы JAR, совместимые с Java 5. В этом случае, поскольку вы создаете собственную библиотеку, вам нужно использовать параметр -target 1.5. (target="1.5", если вы используете задачу ant <javac>) Как правило, это не имеет большого значения, так как 1.6 является своего рода постепенным улучшением по сравнению с 1.5, хотя, если вы используете некоторые из нескольких классов Java 6, таких как ArrayDeque или внешние библиотеки, зависящие от 1.6, вы не повезло.

  • используйте JRE 1.6 с Matlab 7.4, изменив JVM. Не уверен, что это хорошая идея.

  • обновите MATLAB до версии, работающей на Java 6 (R2007b или новее).

Помните об этой проблеме, когда будете обновлять среду разработки Java до Java 7 или Java 8.

person Jason S    schedule 08.08.2011
comment
Извиняюсь, я имел в виду javaclasspath('c:/reader/example.jar'); Я также убедился, что все там есть, используя jar -tf, а затем на всякий случай открыв файл jar с помощью 7zip. - person ssaammuu; 08.08.2011
comment
Я использую Matlab 7.0.4. Классы являются общедоступными и имеют общедоступные конструкторы без аргументов. Результат этой команды: Скомпилировано из открытого класса SimpleReader.java com.example.reader.SimpleReader extends java.lang.Object{ // список методов, // которые выглядят правильно } - person ssaammuu; 08.08.2011
comment
Ага, скорее всего несовместимость версии JVM. Смотрите мое последнее редактирование. - person Jason S; 08.08.2011
comment
здорово - рад, что смог помочь! Я столкнулся с этим пару лет назад, и это был настоящий тупик. - person Jason S; 09.08.2011
comment
Это также была несовместимость версий для меня; Matlab использовал Java 1.6, но jar был собран с 1.7. Чтобы исправить это, я последовал за изменением ссылки JVM, указанной в ответе. - person emchristiansen; 20.03.2013