2011-08-08 44 views
6

Tôi đã sử dụng Swig để tạo trình bao bọc Java cho một thư viện được viết bằng C++. Trình bao bọc được tạo thành một gói và sau đó là jar 'ed. Các tập tin được biên dịch một cách chính xác và làm việc hoàn hảo với java nhưng tôi không thể gọi nó từ MATLAB.Gọi Java từ MATLAB

Tôi đã thử thêm đường dẫn vào bình trong tệp đường dẫn tĩnh Java trong MATLAB và sau đó gọi các lớp trong tệp jar nhưng tôi gặp lỗi "Undefined variable or class.." Hoặc nếu tôi thử sử dụng javaObject(...)"No class * can be located on Java class path".

Tôi không chắc mình đang làm gì sai.


EDIT:

Để kiểm tra gọi một C++ thư viện từ MATLAB, tôi đã tạo ra một "đọc dữ liệu" lớp đơn giản, trong đó có một chức năng mà viết một được tạo ngẫu nhiên vector< vector<double> > vào một tập tin văn bản và và một hàm đọc nó.

Các file uống một lân tạo ra là: SimpleReader.java, DoubleVector.java, exampleJNI.java, example.java, DoubleVector2.java trong gói com.example.reader. Chúng được biên dịch và đóng gói thành example.jar (thư viện dll được tạo ra cũng được đóng gói vào trong lọ).

Tất cả đều hoạt động tốt khi gọi nó từ java nên vấn đề phải cụ thể đối với MATLAB. Không có nhiều mã cho MATLAB vì không có gì có vẻ hiệu quả. Tôi có được như xa như

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

tại thời điểm đó tôi nhận được 'Undefined variable "com" or class "com.example.reader.SimpleReader"'

+0

Xin vui lòng cho một ví dụ chi tiết hơn về những gì báo cáo MATLAB bạn đang thực hiện. –

Trả lời

7

Nói chung bạn đang nghĩ để có thể làm điều này:

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

Tôi đã sử dụng điều này với MATLAB trong một thời gian ngắn và không gặp rắc rối. Có lẽ bạn có thể đăng chính xác mã MATLAB bạn đang sử dụng?


tôi nhận được như xa như

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

tại thời điểm đó tôi nhận được 'biến Không xác định "com" hoặc lớp "com.example.reader.SimpleReader"'

Vâng, để bắt đầu, bạn đã đề cập đến jarfile của bạn được gọi là example.jar, nhưng mã MATLAB của bạn tham khảo reader.jar - bạn có chắc chắn cái bình bạn đang tham chiếu trong javaclasspath() exis ts? Bạn đã thử xem nội dung của nó chưa? (Ví dụ với 7zip hoặc bất kỳ chương trình có thể đọc các tập tin .zip định dạng, kể từ file .jar chỉ .zip định dạng tập tin với thông số kỹ thuật khác)


hmmm ...

  • phiên bản nào của MATLAB bạn đang sử dụng?
  • là các lớp học của bạn được công khai?
  • gì bạn nhận được khi bạn cố gắng gõ như sau:

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

Bạn nói rằng bạn đang sử dụng phiên bản 7.0.4 - đây có thể là vấn đề. Earlier versions of MATLAB use an older version of the Java JRE:

MATLAB chỉ được hỗ trợ đầy đủ trên JVM mà chúng tôi giao hàng với MATLAB. Ví dụ:

JVM 1.3.1 cho MATLAB 6.5.1 (R13SP1)

JVM 1.4.2 cho MATLAB 7.0.1 (R14SP1)

MATLAB 7.0.4 (R14SP2) và phiên bản mới đến MATLAB 7.4 (R2007a) sử dụng JVM 1.5 và MATLAB 7.5 (R2007b) và sau đó sử dụng JVM 1.6. Có các thành phần có thể không hoạt động đúng theo một phiên bản khác của JVM.

Về cơ bản, bạn có ba lựa chọn tại thời điểm này.

  • (nếu có thể) - chỉ sử dụng các tập tin JAR tương thích với Java 5. Trong trường hợp này, vì bạn đang làm cho thư viện riêng của bạn, bạn cần phải sử dụng the -target 1.5 option. (target="1.5" nếu bạn đang sử dụng tác vụ ant <javac>) Đây không phải là một vấn đề lớn, vì 1,6 là một sự cải tiến gia tăng từ 1,5 - mặc dù nếu bạn đang sử dụng một vài lớp Java 6 như ArrayDeque hoặc các thư viện bên ngoài phụ thuộc vào 1.6, bạn không may mắn.

  • sử dụng JRE 1.6 với Matlab 7.4 theo changing the JVM. Không chắc đây là một ý hay.

  • nâng cấp MATLAB lên phiên bản chạy trên Java 6 (R2007b trở lên).

Ghi vấn đề này khi bạn đi để nâng cấp môi trường phát triển Java của bạn đến Java 7 hoặc Java 8.

+0

^Tôi đã thêm chi tiết vào câu hỏi, cảm ơn – ssaammuu

+0

Các lời xin lỗi tôi ngụ ý javaclasspath ('c: /reader/example.jar'); Tôi cũng đã đảm bảo mọi thứ đã có trong đó bằng cách sử dụng jar -tf, và sau đó chỉ trong trường hợp mở tệp jar bằng 7zip. – ssaammuu

+0

Tôi đang sử dụng Matlab 7.0.4. Các lớp là công khai và có các hàm tạo công khai không có đối số. Lệnh đó dẫn đến: Biên soạn từ "SimpleReader.java" lớp công khai com.example.reader.SimpleReader mở rộng java.lang.Object { // danh sách các phương thức // trông chính xác } – ssaammuu