2016-06-30 2 views
7

Je veux appeler le code Rust de Java/Android, et je l'ai trouvé 3 variantes de le faire:Comment automatiser les liaisons Java pour le code Rust?

  1. JNI
  2. JNA
  3. JNR FFI

JNI semble bon et puissant assez, mais vous devez écrire trop de code à la main.

JNA, sinon en prenant en considération qu'il crashes on my machine, nécessite l'écriture de la description du type de données de Rust en Java à la main, le même problème avec JNR FFI.

Je me demande comment sera difficile de générer le code JNI pour traits et struct avec des macros ou un plug-in de compilateur? Ce compilateur doit correspondre à traits implémentations pour struct béton, et aussi 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 
    } 
} 

et créer des classes Java pour les classes struct et Java avec native fonctions, ainsi que générer pubno_mangle fonctions que les fonctions des traits d'enveloppe.

Répondre

3

Afin de fournir #[jni] annotations qui fonctionnent comme cela, vous devez utiliser un plugin de compilateur. Ce serait un outil génial, mais il n'existe pas encore, autant que je sache.

Il y a des morceaux d'outils qui pourraient vous aider, si vous voulez créer un projet qui le fait. Les plugins sont actuellement instables et ne fonctionnent pas en cas de rouille non nocturne. vous voudrez probablement utiliser syntex, qui fournit une interface stable aux plugins du compilateur. Vous pouvez également écrire un raw plugin (voir here pour l'API pour ceux-ci), mais la plupart des gens ne seront pas en mesure de l'utiliser.

rusty-cheddar, qui génère des fichiers d'en-tête c; vous pourriez jeter un coup d'oeil à cela pour voir comment cela fonctionne. L'auteur de cela semble également travailler sur un cadre plus général de génération de liaisons, mais je ne sais pas si c'est actif. Vous pourriez être en mesure d'accrocher la sortie du cheddar à quelque chose comme JNAerator, mais il ne créera probablement pas les interfaces les plus jolies du côté java. Il existe également rust-bindgen et corrode, qui fonctionnent dans l'autre sens ils traduisent les en-têtes c et le code arbitraire c en rouille respectivement. Je ne sais pas si c'est vraiment utile.

JNI-sys fournit des liaisons JNI de bas niveau; rust-on-mobile est un petit projet qui l'utilise. Voir aussi First steps with Rust and Java, un billet de blog qui montre quelques rudiments de faire des choses.Enfin, il ya cbox, qui vous permet de contourner la maladresse avec la propriété et FFI.

0

Vous pouvez utiliser jnaerator pour générer automatiquement vos mappages de structure pour JNA.

Alternativement, si vous voulez utiliser JNI (et compiler un peu plus de code natif), vous devriez aller avec SWIG.

+1

Swig peut gérer la rouille? Je veux dire explicite, pas genetate c/C++ que je dois coller pour rouiller le code. – fghj

+1

Plus la documentation de jnaerator sur le c/C++, l'objectif-c, mais pas la rouille, est-elle vraiment compatible avec la rouille? – fghj