2017-11-01 5 views
0

JVMを起動し、Rustから静的Javaメソッドを呼び出したいとします。最初はすべて正常に動作し、コンソールに期待される出力が表示されます。しかし、Javaメソッドが終了する前に、私はセグメンテーションフォルトを取得します。Rustから呼び出したときJava JNIが終了するとクラッシュする

これが出力される:ここ

Hello World! 
Segmentation fault (core dumped) 

は(脂肪ジャーにパッケージ化)のJavaクラスである:

public class HelloWorld { 
    public static void greetings() { 
     System.out.println("Hello World!"); 
    } 
} 

これは私が実行さびコードである:

extern crate rucaja; 

use rucaja::{Jvm, jvalue}; 

fn main() { 

    // The class path must contain the fat JAR. 
    let class_path = "-Djava.class.path=./java/target/hello-0.1.0.jar"; 

    let jvm_options = [class_path]; 

    unsafe { 
     // Instantiate the embedded JVM. 
     let jvm = Jvm::new(&jvm_options); 

     // Resolve the Java wrapper class from the fat JAR. 
     let main_class = jvm.get_class("HelloWorld").expect("Could not find Java class"); 

     // Resolve Java methods in that wrapper class. 
     let greetings_method = jvm.get_static_method(
      &main_class, 
      "greetings", 
      "()V" 
     ).expect("Could not find Java method"); 

     // Prepare (no) arguments 
     let args: Vec<jvalue> = vec![ 
     ]; 

     // Call the method 
     jvm.call_static_object_method(
      &main_class, 
      &greetings_method, 
      args.as_ptr() 
     ); 
    } 

    println!("Done"); 
} 

gdbで実行しようとしましたが、スタックが壊れています:

Program received signal SIGSEGV, Segmentation fault. 
0x00007fffe575d2b4 in ??() 
(gdb) bt 
#0 0x00007fffe575d2b4 in ??() 
#1 0x0000000000000246 in ??() 
#2 0x00007fffe575d160 in ??() 
#3 0x00007fffffffd530 in ??() 
#4 0x00007fffffffd4e0 in ??() 
#5 0x00007ffff790a6ad in ??() from /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so 
Backtrace stopped: previous frame inner to this frame (corrupt stack?) 

セグメント違反の原因は何と思いますか?

答えて

2

Javaメソッドはオブジェクトを返さないため、jvm.call_static_object_method(...)の代わりにjvm.call_static_void_method(...)を使用する必要があります。

正しいコード:

// Call the method 
jvm.call_static_void_method(
    &main_class, 
    &greetings_method, 
    args.as_ptr() 
); 

その後、プログラムは正常に動作します:

Hello World! 
Done 
関連する問題