2010-10-24 29 views
24

Tôi có một plugin Eclipse (A) có phụ thuộc vào một plugin (B) khác. Plugin B chỉ đơn giản là một trình bao bọc xung quanh một cái lọ, chứa một dll bản địa, và thực hiện chức năng jni. Với thiết lập này, tôi có đoạn mã sau vào phương pháp bắt đầu của một lớp Activator của:Làm thế nào tôi có thể chuyển hướng đầu ra giao diện điều khiển JNI sang giao diện điều khiển Eclipse, khi trình cắm thêm Eclipse sử dụng JNI?

MessageConsole jniConsole = new MessageConsole("Opereffa Output", null); 
ConsolePlugin.getDefault().getConsoleManager().addConsoles(new IConsole[] { jniConsole }); 
ConsolePlugin.getDefault().getConsoleManager().showConsoleView(jniConsole); 
MessageConsoleStream stream = jniConsole.newMessageStream(); 
System.setOut(new PrintStream(stream)); 
System.setErr(new PrintStream(stream)); 

Khi cắm A thực hiện chức năng của nó, việc sử dụng System.out thực sự đi vào giao diện điều khiển trong Eclipse. Nhưng mã nguồn gốc được JNI sử dụng cũng ghi vào luồng đầu ra mà tôi không thể lấy được. Trong quá trình phát triển, đầu ra từ JNI chuyển đến bàn điều khiển của cá thể Eclipse đã khởi chạy cá thể đang chạy, chứa các trình bổ sung.

Vậy làm cách nào để lấy đầu ra JNI và hiển thị trong bảng điều khiển?

+2

Chức năng nào ghi nhật ký trong mã gốc? printf, fprintf, puts? ... Bạn có thể tự do viết lại mã, thay đổi chức năng ghi nhật ký không? –

+0

Vì JNI có liên quan: Làm thế nào di động phải là một giải pháp? Trên nền tảng nào nó hoạt động ít nhất? –

Trả lời

0

Bạn thực sự không thể. DLL gốc sử dụng các phương thức stdio mà bạn không thể truy cập từ Java. Nếu bạn viết thư cho System.out, thời gian chạy Java cuối cùng cũng sử dụng các phương thức tương tự nhưng vì những lý do rõ ràng, các thay đổi trong System.out không có tác dụng với cơ sở thời gian chạy C.

Có giải pháp phần cứng: Nhận màn hình thứ hai để bạn có thể thấy thiết bị đầu cuối mà bạn đã khởi động Eclipse mọi lúc.

1

Bạn có thể thử sử dụng freopen để chuyển hướng stdout theo cách giống như cách bạn làm trong Java, nhưng về phía gốc. Câu hỏi đặt ra là liệu điều này có hiệu quả nếu bạn sử dụng nó trong plugin của riêng bạn (với một dll JNI mới): nó có thể cần phải được sử dụng từ bên trong dll làm đầu ra console, tôi không có ý tưởng về sự tương tác giữa các luồng trên các DLL . Nếu stdout đề cập đến luồng được chia sẻ cho toàn bộ quá trình, có thể nó sẽ hoạt động.

Các vấn đề liên quan