2016-06-30 39 views
7

Voglio chiamare il codice Rust da Java/Android, e ho trovato 3 varianti di farlo:Come automatizzare i binding Java per il codice Rust?

  1. JNI
  2. JNA
  3. JNR FFI

JNI sembra buono e potente abbastanza, ma devi scrivere troppo codice a mano.

JNA, se non prendere in considerazione che crashes on my machine, richiede crei ruggine struct descrizione tipo di dati in Java mano, lo stesso problema con JNR FFI.

Allora mi chiedo quanto sia difficile sarà generare JNI codice per traits e struct con le macro o un plugin compilatore? Questo compilatore dovrebbe corrispondere tratti implementazioni per struct calcestruzzo, e anche 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 
    } 
} 

e creare classi Java per le classi struct e Java con native funzioni, oltre a generare pubno_mangle funzioni che i tratti avvolgere funzioni.

risposta

3

Per fornire le annotazioni #[jni] che funzionano in questo modo, è necessario utilizzare un plug-in del compilatore. Sarebbe uno strumento fantastico, ma non esiste ancora, per quanto ne so.

Ci sono alcuni frammenti di strumenti che potrebbero essere utili, se si desidera creare un progetto che faccia questo.

I plugin sono attualmente instabili e non funzionano su ruggine non notturna; probabilmente vorrai usare syntex, che fornisce un'interfaccia stabile ai plugin del compilatore. Potresti anche scrivere un raw plugin (vedi here per l'API per quelli), ma la maggior parte delle persone non sarà in grado di usarlo.

C'è rusty-cheddar, che genera file di intestazione c; potresti dare un'occhiata a questo per vedere come funziona. Anche l'autore di questo sembra lavorare su un quadro di generazione di binding più generale, ma non so se è attivo. Potresti essere in grado di collegare l'output di cheddar a qualcosa come JNAerator, ma probabilmente non creerà le interfacce più belle sul lato java.

Ci sono anche rust-bindgen e corrode, che funzionano nell'altra direzione; traducono rispettivamente le intestazioni c e il codice arbitrario c in ruggine. Non so se sia davvero utile.

JNI-sys fornisce binding JNI di basso livello; rust-on-mobile è un piccolo progetto che lo utilizza. Vedi anche First steps with Rust and Java, un post sul blog che mostra alcuni rudimenti di come far funzionare le cose.

Infine, c'è cbox, che consente di aggirare l'imbarazzo con la proprietà e FFI.

0

È possibile utilizzare jnaerator per generare automaticamente i mapping della struttura per JNA.

In alternativa, se si desidera utilizzare JNI (e compilare un po 'di codice nativo), si consiglia di utilizzare SWIG.

+1

Il tampone può maneggiare la ruggine? Intendo dire esplicita, non genetate c/C++ che devo incollare al codice ruggine. – fghj

+1

Più documentazione di jnaerator point su c/C++, obiettivo-c, ma non ruggine, è davvero un supporto per la ruggine? – fghj

Problemi correlati