diff --git a/java_src/me/ehlxr/HelloWorld.java b/java_src/me/ehlxr/HelloWorld.java index 42d8c2f..cf6d3ad 100644 --- a/java_src/me/ehlxr/HelloWorld.java +++ b/java_src/me/ehlxr/HelloWorld.java @@ -1,4 +1,7 @@ package me.ehlxr; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; class HelloWorld { static { @@ -7,9 +10,11 @@ class HelloWorld { System.loadLibrary("mylib"); } - public long no; + public Long no; private String name; public int age; + public List ls; + public Map map; private static native String hello(String input); @@ -47,10 +52,15 @@ class HelloWorld { // System.out.println("Invoking asyncComputation (thread id = " + Thread.currentThread().getId() + ")"); // asyncComputation(new HelloWorld()); + List ls = new ArrayList<>(); + ls.add("ls1"); + ls.add("ls2"); + ls.add("ls3"); HelloWorld hw = new HelloWorld(); hw.setName("Jack"); hw.no = 123434555L; hw.age = 30; + hw.ls = ls; System.out.println(HelloWorld.getFiled(hw)); } diff --git a/mylib/src/lib.rs b/mylib/src/lib.rs index 063f45d..d00e427 100644 --- a/mylib/src/lib.rs +++ b/mylib/src/lib.rs @@ -1,4 +1,4 @@ -use jni::objects::{GlobalRef, JClass, JObject, JString, JValue}; +use jni::objects::{GlobalRef, JClass, JList, JObject, JString, JValue}; use jni::sys::{jbyteArray, jint, jlong, jstring}; use jni::JNIEnv; use std::{sync::mpsc, thread, time::Duration}; @@ -9,6 +9,23 @@ pub extern "system" fn Java_me_ehlxr_HelloWorld_getFiled( _class: JClass, input: JObject, ) -> jstring { + let jlist = env + .get_list( + env.get_field(input, "ls", "Ljava/util/List;") + .unwrap() + .l() + .unwrap(), + ) + .unwrap(); + let jlist_iter = jlist.iter().unwrap(); + jlist_iter.into_iter().for_each(|jobj| { + let jstr: JString = jobj.into(); + println!( + "get list filed: {}", + String::from(env.get_string(jstr).unwrap()) + ); + }); + let age = env.get_field(input, "age", "I").unwrap().i().unwrap(); println!("get age field: {}", age); @@ -23,9 +40,22 @@ pub extern "system" fn Java_me_ehlxr_HelloWorld_getFiled( String::from(env.get_string(name).unwrap()) ); - let no = env.get_field(input, "no", "J").unwrap().j().unwrap(); - // let jstr = env.get_string(JString::from(no)).unwrap(); - // println!("get addr field: {}", String::from(jstr)); + // let no = env.get_field(input, "no", "J").unwrap().j().unwrap(); + // println!("get no field: {}", no); + + let no = env + .call_method( + env.get_field(input, "no", "Ljava/lang/Long;") + .unwrap() + .l() + .unwrap(), + "longValue", + "()J", + &[], + ) + .unwrap() + .j() + .unwrap(); println!("get no field: {}", no); let out_str = if let JValue::Object(result) = env