2016-06-30 9 views
7

Ich möchte Rust Code aus Java/Android anrufen, und ich habe drei Varianten, so zu tun gefunden:Wie automatisieren Java-Bindungen für Rust-Code?

  1. JNI
  2. JNA
  3. JNR FFI

JNI sieht gut aus und leistungsstark Genug, aber Sie müssen zu viel Code von Hand schreiben.

JNA, wenn nicht in Betracht gezogen, dass es crashes on my machine erfordert von Hand Rust struct Datentypbeschreibung in Java schreiben, das gleiche Problem mit JNR FFI. So

Ich frage mich, wie schwierig JNI Code für traits und struct mit Makros oder einem Compiler-Plugin generieren sein wird? Diese Compiler sollen Züge Implementierungen für konkrete Struktur entsprechen, und auch

#[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 
    } 
} 

struct und Java-Klassen für Struktur und Java-Klassen mit native Funktionen erstellen, und erzeugen pubno_mangle Funktionen, die Wickeleigenschaften Funktionen.

Antwort

3

Um #[jni] Annotationen bereitzustellen, die so funktionieren, müssten Sie ein Compiler-Plugin verwenden. Es wäre ein großartiges Werkzeug, aber soweit ich weiß, existiert es noch nicht.

Es gibt Teile von Werkzeug herumliegen, die hilfreich sein könnten, wenn Sie ein Projekt erstellen möchten, das dies tut.

Plugins sind derzeit instabil und funktionieren nicht bei nächtlichem Rost; Sie möchten wahrscheinlich syntex verwenden, die eine stabile Schnittstelle zu Compiler-Plugins bietet. Sie könnten auch eine raw plugin (siehe here für die API für diese) schreiben, aber die meisten Leute werden nicht in der Lage sein, es zu benutzen.

Es gibt rusty-cheddar, die c Header-Dateien generiert; Sie können sich das ansehen, um zu sehen, wie es funktioniert. Der Autor scheint auch an einem allgemeineren Bindungsgenerierungsrahmen zu arbeiten, aber ich weiß nicht, ob er aktiv ist. Sie könnten die Ausgabe von Cheddar an etwas wie JNAerator hängen, aber es wird wahrscheinlich nicht die schönsten Schnittstellen auf der Java-Seite erstellen.

Es gibt auch rust-bindgen und corrode, die in die andere Richtung arbeiten; Sie übersetzen c-Header und beliebigen c-Code jeweils in rost. Ich weiß nicht, ob das wirklich hilfreich ist.

JNI-sys bietet Low-Level-JNI-Bindungen; rust-on-mobile ist ein kleines Projekt, das es verwendet. Siehe auch First steps with Rust and Java, ein Blog-Post, der ein paar Rudimente zeigt, wie man Dinge zusammenbringt.

Schließlich gibt es cbox, mit denen Sie um Unbeholfenheit mit Besitz und FFI umgehen können.

0

Sie können jnaerator verwenden, um Ihre Strukturzuordnungen für JNA automatisch zu generieren.

Alternativ, wenn Sie JNI verwenden möchten (und einige mehr nativen Code kompilieren) sollten Sie mit SWIG gehen.

+1

Swig kann mit Rost umgehen? Ich meine ausdrücklich, nicht genate c/C++, die ich an den Rostcode kleben muss. – fghj

+1

Plus-Dokumentation von jnanerator Punkt über c/C++, Ziel-c, aber nicht Rost, ist es wirklich Unterstützung Rost? – fghj