Làm cách nào tôi có thể gọi Foo :: in từ Java để đầu ra xuất hiện?
Về mặt khái niệm, cách để lấy Foo :: print (...) để ghi vào một thể hiện Java OutputStream hiện có là viết một C++ std :: ostream implementation thực sự thực hiện một cuộc gọi lại vào Java để thực hiện đầu ra .
Điều đó nghe có vẻ, nhưng tôi không muốn viết/duy trì mã. Khi chạy, bạn sẽ có các cuộc gọi đi từ Java -> C++ -> Java, và có rất nhiều cơ hội để thực hiện các lỗi sẽ ngẫu nhiên phá vỡ JVM của bạn.
Có cách nào để ép buộc OutputStream thành std :: ostream trong lớp JNI không?
AFAIK no.
Tôi có thể chụp đầu ra trong bộ đệm lớp JNI và sau đó sao chép nó vào không?
Bạn có ý nghĩa đại khái như thế này không?
MyJNIThing m = ...
int myOstream = m.createMemoryBackedOStream(...); // native method
...
m.someMethodWrapper(... myOStream); // native method
...
byte[] data = m.getCapturedData(myOStream); // native method
out.write(data);
Có thể bạn có thể làm một việc như thế ... vào một ngày tốt lành với gió sau.
Nhưng tôi nghĩ bạn nên thực sự nhằm loại bỏ mã C++ thay vì cố gắng làm những điều ngày càng phức tạp trên JNI. IMO, JNI chỉ nên được sử dụng như một phương sách cuối cùng, và không phải là một đoạn cắt ngắn để tránh việc ghi lại nội dung trong Java.
Nguồn
2009-09-16 22:49:26
Thực hiện lại thư viện trong Java không phải là một tùy chọn (nó là lớn, trưởng thành và hiệu suất chuyên sâu). –
Có lẽ bạn không nên cố gắng gọi nó từ Java sau đó. Quan điểm của tôi là bạn có khả năng tạo ra nhiều đau đớn cho bản thân và những người phải duy trì mã của bạn. –
Trong khi tôi đồng ý với mã JNI thì khó có thể nói rằng bạn nên tránh nó không công bằng. Có chắc chắn là một nơi cho JNI, đặc biệt với các dự án di sản lớn như op đề cập và trong trường hợp của tôi API bên thứ 3 mà bạn phải sử dụng để hoàn thành công việc. Đây là một câu hỏi rất hợp lệ, tôi cũng đang tìm kiếm câu trả lời. – Cliff