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?)
セグメント違反の原因は何と思いますか?