modify
diff --git a/dlsmk/Cargo.toml b/dlsmk/Cargo.toml
index 4042d47..76c2eaa 100644
--- a/dlsmk/Cargo.toml
+++ b/dlsmk/Cargo.toml
@@ -14,6 +14,6 @@
 
 [dependencies]
 jni = "0.18.0"
-dlqrcode = { path = "../daliqrcode" }
+dlqrcode = { path = "../dlqrcode" }
 libc = "0.2.80"
 hex = "0.4.2"
diff --git a/dlsmk/src/lib.rs b/dlsmk/src/lib.rs
index 402a0c0..fa982de 100644
--- a/dlsmk/src/lib.rs
+++ b/dlsmk/src/lib.rs
@@ -25,7 +25,7 @@
 pub mod android {
     extern crate jni;
 
-    use self::jni::objects::{JClass, JObject, JString};
+    use self::jni::objects::{JClass, JMap, JObject, JString};
     use self::jni::sys::{jboolean, jlong, JNI_FALSE, JNI_TRUE};
     use self::jni::JNIEnv;
     // use super::*;
@@ -34,6 +34,14 @@
 
     use dlqrcode::DaliQrCode;
 
+    fn put_data(env: &JNIEnv, map: &JMap, key: &str, value: &str) {
+        map.put(
+            *env.new_string(key).unwrap(),
+            *env.new_string(value).unwrap(),
+        )
+        .unwrap();
+    }
+
     #[no_mangle]
     pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_decode(
         env: JNIEnv,
@@ -43,42 +51,57 @@
         offset: jlong,
         result: JObject,
     ) -> jboolean {
-        // Our Java companion code might pass-in "world" as a string, hence the name.
-        let key = env
-            .get_string(key_hex)
-            .expect("invalid key string")
-            .as_ptr();
-        let keylen = libc::strlen(key);
-
-        println!("decode test, key length {}", keylen);
         let key = {
-            let k: &[u8] = slice::from_raw_parts(key as *const u8, keylen);
-            println!("key is : {}", String::from_utf8_lossy(k));
-            let mut key = [0u8; 32];
-            if let Ok(v) = hex::decode(k) {
-                key.clone_from_slice(v.as_slice());
-                key
+            let s = env
+                .get_string(key_hex)
+                .expect("invalid key string")
+                .as_ptr();
+            let keylen = libc::strlen(s);
+            let mut k = Vec::new();
+            k.extend_from_slice(slice::from_raw_parts(s as *const u8, keylen));
+            k
+        };
+
+        let qrcode = {
+            let s = env
+                .get_string(qrcode)
+                .expect("invalid qrcode string")
+                .as_ptr();
+            let qrlen = libc::strlen(s);
+            let mut q = Vec::new();
+            q.extend_from_slice(slice::from_raw_parts(s as *const u8, qrlen));
+            q
+        };
+
+        let qrdata = env.get_map(result).expect("invalid qrdata map");
+
+        let key = {
+            let mut k = [0u8; 32];
+            if let Ok(v) = hex::decode(key.as_slice()) {
+                k.clone_from_slice(v.as_slice());
+                k
             } else {
+                put_data(
+                    &env,
+                    &qrdata,
+                    "error",
+                    "key must be hex format and 64 characters",
+                );
                 return JNI_FALSE;
             }
         };
 
-        let qrcode = env
-            .get_string(qrcode)
-            .expect("invalid qrcode string")
-            .as_ptr();
-        let qrlen = libc::strlen(qrcode);
-
-
         let decode = match DaliQrCode::new(key, None, None, None, None) {
             Ok(d) => d,
-            Err(e) => panic!("invalid key {}", e),
+            Err(e) => {
+                let s = format!("invalid input parameter {:?}", e);
+                put_data(&env, &qrdata, "error", &s);
+                return JNI_FALSE;
+            }
         };
 
-        println!("decode qrcode begin , length : {}...", qrlen);
-        match decode.decode(qrcode as *const u8, qrlen, offset as i32) {
+        match decode.decode(qrcode.as_ptr(), qrcode.len(), offset as i32) {
             Ok(d) => {
-                let qrdata = env.get_map(result).expect("invalid qrdata map");
                 qrdata
                     .put(
                         *env.new_string("cardno").unwrap(),
@@ -100,9 +123,10 @@
                 return JNI_TRUE;
             }
             Err(e) => {
-                println!("Error {:?}", e);
+                let s = format!("{:?}", e);
+                put_data(&env, &qrdata, "error", &s);
                 return JNI_FALSE;
-            },
+            }
         };
     }
 }