2016-06-30 5 views
7

나는 자바/안드로이드에서 녹 코드를 호출 할, 나는 그렇게 할 3 개 변종을 발견했습니다녹 코드의 Java 바인딩을 자동화하는 방법은 무엇입니까?

  1. JNI
  2. JNA
  3. JNR FFI

JNI 좋은 강력한 보인다 충분히,하지만 당신은 너무 많은 코드를 직접 작성해야합니다.

JNA

, 그것은 crashes on my machine, JNR FFI으로, 손으로 자바 같은 문제를 녹 구조체 데이터 유형에 대한 설명을 서면으로 요구하는 고려하지 경우.

그래서 나는 매크로 나 컴파일러 플러그인 traitsstruct에 대한 JNI 코드 를 생성하는 방법을 어렵게 될 것입니다 궁금해? 이 컴파일러는, 콘크리트 구조체에 대한 을 특성 구현과 일치하고 또한

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

을 구조체와 native 기능 구조체 및 Java 클래스에 대한 자바 클래스를 생성 플러스가 랩 특성 기능 pubno_mangle 기능을 생성해야합니다.

답변

3

컴파일러 플러그인을 사용해야하는 것처럼 작동하는 #[jni] 주석을 제공하려면 다음을 수행하십시오. 그것은 굉장한 도구 일 것입니다, 그러나 제가 아는 한 그것은 아직 존재하지 않습니다.

이 작업을 수행하는 프로젝트를 만들려면 도움이 될만한 도구 및 도구가 있습니다.

플러그인은 현재 불안정하며 밤에 녹이지 않는 플러그인에서는 작동하지 않습니다. 컴파일러 플러그인에 안정적인 인터페이스를 제공하는 syntex을 사용하려고합니다. raw plugin (해당 API에 대해서는 here 참조)을 쓸 수도 있지만 대부분의 사용자는이 API를 사용할 수 없습니다.

rusty-cheddar은 c 헤더 파일을 생성합니다. 어떻게 작동하는지 볼 수 있습니다. 그 저자는보다 일반적인 바인딩 생성 프레임 워크에서 작동하는 것처럼 보이지만 활성화되어 있는지 여부는 알 수 없습니다. 체다의 출력을 JNAerator와 같은 것으로 연결할 수는 있지만 자바 측에서 가장 예쁜 인터페이스를 생성하지는 못할 것입니다.

rust-bindgencorrode도 있습니다. 다른 방향으로 작동합니다. 그들은 c 헤더와 임의의 c 코드를 각각 녹스로 번역합니다. 그것이 실제로 도움이되는지 나는 모른다.

JNI-sys은 낮은 수준의 JNI 바인딩을 제공합니다. rust-on-mobile은 그것을 사용하는 작은 프로젝트입니다. 또한 First steps with Rust and Java 블로그 게시물을 참조하십시오.

마지막으로 소유권과 FFI로 어색함을 해결할 수있는 cbox이 있습니다.

0

jnaerator을 사용하면 JNA에 대한 구조 매핑을 자동으로 생성 할 수 있습니다.

또한 JNI를 사용하고 (일부 원시 코드를 컴파일하려는 경우) SWIG으로 가야합니다.

+1

부끄러움을 치료할 수 있습니까? 내가 코드를 녹이기 위해서 접착제를 사용해야하는 명백한 c/C++가 아니라는 것을 의미합니다. – fghj

+1

c/C++, objective-c에 대한 jn 네이터 포인트에 대한 설명서가 있지만 녹이 아닌 것은 정말 녹을 지원합니까? – fghj