2016-06-30 14 views
7

Tôi muốn gọi mã Rust từ Java/Android, và tôi đã tìm thấy 3 biến thể làm như vậy:Làm thế nào để tự động hóa các ràng buộc Java cho mã Rust?

  1. JNI
  2. JNA
  3. JNR FFI

JNI có vẻ tốt và mạnh mẽ đủ, nhưng bạn phải viết quá nhiều mã bằng tay.

JNA, nếu không tính đến nó crashes on my machine, yêu cầu viết mô tả kiểu dữ liệu Rust struct trong Java bằng tay, cùng một vấn đề với JNR FFI.

Vì vậy, tôi tự hỏi làm thế nào khó khăn sẽ được tạo ra JNI mã cho traitsstruct với macro hoặc plugin trình biên dịch? trình biên dịch này phải phù hợp với đặc điểm triển khai cho struct bê tông, và cũng struct

#[JNI] 
struct Foo { 
    a: i32, 
} 

trait Boo { 
    fn f(&self, b: f64) -> f64; 
} 
#[JNI] 
impl Boo for Foo { 
    fn f(&self, b: f64) -> f64 { 
     0f64 
    } 
} 

và tạo các lớp Java cho các lớp học struct và Java với native chức năng, cộng với tạo pubno_mangle chức năng mà đặc điểm quấn chức năng.

Trả lời

3

Để cung cấp chú thích #[jni] hoạt động giống như bạn cần sử dụng plugin trình biên dịch. Nó sẽ là một công cụ tuyệt vời, nhưng nó vẫn chưa tồn tại, theo như tôi biết.

Có các bit và phần của dụng cụ nằm xung quanh có thể hữu ích, nếu bạn muốn tạo một dự án thực hiện điều này.

Plugins hiện không ổn định và không hoạt động trên môi trường không bị rỉ sét; bạn có thể muốn sử dụng syntex, cung cấp một giao diện ổn định cho các trình biên dịch bổ sung. Bạn cũng có thể viết raw plugin (xem here cho API cho những người đó), nhưng hầu hết mọi người sẽ không thể sử dụng nó.

rusty-cheddar, tạo tệp tiêu đề c; bạn có thể xem nó để xem nó hoạt động ra sao. Tác giả của điều đó cũng dường như đang làm việc trên một khung công tác liên kết tổng quát hơn, nhưng tôi không biết nó có hoạt động hay không. Bạn có thể kết nối đầu ra của cheddar với một cái gì đó giống như JNAerator, nhưng nó có lẽ sẽ không tạo ra các giao diện đẹp nhất ở phía java.

Ngoài ra còn có rust-bindgencorrode, hoạt động theo một hướng khác; chúng dịch các tiêu đề c và mã c tùy ý thành rỉ sét tương ứng. Tôi không biết nếu điều đó thực sự hữu ích.

JNI-sys cung cấp các kết buộc JNI cấp thấp; rust-on-mobile là một dự án nhỏ sử dụng nó. Ngoài ra, hãy xem First steps with Rust and Java, một bài đăng trên blog cho thấy một số nguyên tắc của việc kết nối mọi thứ.

Cuối cùng, có cbox, cho phép bạn làm việc xung quanh vụng về với quyền sở hữu và FFI.

0

Bạn có thể sử dụng jnaerator để tự động tạo ánh xạ cấu trúc cho JNA.

Hoặc, nếu bạn muốn sử dụng JNI (và biên dịch một số mã gốc), bạn nên đi với SWIG.

+1

Swig có thể xử lý gỉ? Tôi có nghĩa là explicity, không genetate c/c + + mà tôi có Để keo vào mã gỉ. – fghj

+1

Thêm tài liệu về điểm jnaerator về c/C++, mục tiêu-c, nhưng không bị rỉ sét, liệu nó có thực sự hỗ trợ gỉ không? – fghj

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