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;
-            },
+            }
         };
     }
 }
