Вызов Java из MATLAB - PullRequest
       31

Вызов Java из MATLAB

7 голосов
/ 08 августа 2011

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

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

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


EDIT:

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

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

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

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

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

1 Ответ

7 голосов
/ 08 августа 2011

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

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"'

Ну, для начала, вы упомянули, что ваш jarfile называется 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.

...