diff --git a/Makefile b/Makefile
index 643a3dc..7a824c5 100644
--- a/Makefile
+++ b/Makefile
@@ -8,8 +8,8 @@
 	$(CARGO) build --release
 
 android:
-	$(CARGO) build --target aarch64-linux-android --release -- -C prefer-dynamic
-	$(CARGO) build --target armv7-linux-androideabi --release -- -C prefer-dynamic
+	$(CARGO) build --target aarch64-linux-android --release
+	$(CARGO) build --target armv7-linux-androideabi --release
 
 clean:
 	$(RM) -rf target
diff --git a/dlqrcode/src/lib.rs b/dlqrcode/src/lib.rs
index fdcad91..a28a70d 100644
--- a/dlqrcode/src/lib.rs
+++ b/dlqrcode/src/lib.rs
@@ -41,11 +41,11 @@
     #[allow(dead_code)]
     fn new() -> Self {
         Self {
-            uid: String::from(""),
-            cardno: String::from(""),
-            cardtype: String::from(""),
-            totp: String::from(""),
-            nonce: String::from(""),
+            uid: Default::default(),
+            cardno: Default::default(),
+            cardtype: Default::default(),
+            totp: Default::default(),
+            nonce: Default::default(),
             sign: Vec::new(),
         }
     }
@@ -128,31 +128,20 @@
             return Err(DecodeError::new("IV size must be 16 bytes"));
         }
 
-        let step = if let Some(s) = step { s } else { TOTP_STEP };
-
-        let skew = if let Some(s) = skew { s } else { TOTP_SKEW };
-
-        let seed = if let Some(s) = seed {
-            s
-        } else {
-            hex::decode("125ea2f97689988b6501").unwrap()
-        };
+        let totp_step = step.unwrap_or(TOTP_STEP);
+        let totp_skew = skew.unwrap_or(TOTP_SKEW);
+        let totp_seed = seed.unwrap_or(hex::decode("125ea2f97689988b6501").unwrap());
 
         Ok(Self {
             master_key: key,
-            iv: iv,
-            totp_seed: seed,
-            totp_skew: skew,
-            totp_step: step,
+            iv,
+            totp_seed,
+            totp_skew,
+            totp_step,
         })
     }
 
-    pub fn decode(&self, qrcode: *const u8, len: usize, secs_offset: i32) -> Result<DaliQrData> {
-        let qrcode = match self.decode_qrcode(qrcode, len) {
-            Ok(q) => q,
-            Err(e) => return Err(e),
-        };
-        let mut qr_fields: Vec<Vec<u8>> = Vec::new();
+    fn split_qrdata(&self, qrcode: &Vec<u8>, qrdata: &mut Vec<Vec<u8>>) -> Result<()> {
         let v = QR_FIELD_DILIMITER.as_bytes()[0];
         let mut j = 0;
         for i in 0..qrcode.len() {
@@ -160,7 +149,7 @@
                 if i > j {
                     let mut s = Vec::new();
                     s.extend_from_slice(&qrcode[j..i]);
-                    qr_fields.push(s);
+                    qrdata.push(s);
                 }
                 j = i + 1;
             }
@@ -168,19 +157,24 @@
         if j < qrcode.len() {
             let mut s = Vec::new();
             s.extend_from_slice(&qrcode[j..]);
-            qr_fields.push(s);
+            qrdata.push(s);
         }
-        let qr_data = match DaliQrData::from_qrcode(&qr_fields) {
-            Ok(d) => d,
-            Err(e) => return Err(e),
-        };
+        Ok(())
+    }
 
-        match self.check_qrcode_sign(&qr_data) {
-            Ok(result) if !result => return Err(DecodeError::new("invalidate qrcode")),
-            Ok(_) => (),
-            Err(e) => return Err(e),
+    pub fn decode(&self, qrcode: *const u8, len: usize, secs_offset: i32) -> Result<DaliQrData> {
+        let qrcode = self.decode_qrcode(qrcode, len)?;
+        let mut qr_fields: Vec<Vec<u8>> = Vec::new();
+
+        self.split_qrdata(&qrcode, &mut qr_fields)?;
+        
+        let qr_data = DaliQrData::from_qrcode(&qr_fields)?;
+        if qr_data.uid.len() < 16 {
+            return Err(DecodeError::new("uid must grater than 16"));
         }
 
+        self.check_qrcode_sign(&qr_data)?;
+
         let totp = self.new_totp();
         let time = self.totp_time(secs_offset);
         if totp.check(&qr_data.totp, time) {
@@ -190,12 +184,12 @@
         }
     }
 
-    fn check_qrcode_sign(&self, qr_data: &DaliQrData) -> Result<bool> {
+    fn check_qrcode_sign(&self, qr_data: &DaliQrData) -> Result<()> {
         let sign = self.calc_sign(qr_data);
         if qr_data.sign == sign {
-            Ok(true)
+            Ok(())
         } else {
-            Ok(false)
+            Err(DecodeError::new("sign is invalid"))
         }
     }
 
@@ -203,7 +197,7 @@
         &self,
         qrcode: *const u8,
         len: usize,
-    ) -> std::result::Result<Vec<u8>, DecodeError> {
+    ) -> Result<Vec<u8>> {
         let cipher = match Aes256Cbc::new_var(&self.master_key, &self.iv) {
             Ok(c) => c,
             Err(e) => return Err(DecodeError::new(&format!("aes key error {:?}", e))),
@@ -211,7 +205,6 @@
 
         let qrcode = unsafe {
             let s = slice::from_raw_parts(qrcode, len);
-            // println!("qr input : {}", String::from_utf8_lossy(s));
             if let Ok(code) = base64_url::decode(s) {
                 code
             } else {
@@ -219,10 +212,6 @@
             }
         };
 
-        if qrcode.len() % 16 != 0 {
-            return Err(DecodeError::new("Input data length error"));
-        }
-
         match cipher.decrypt_vec(&qrcode) {
             Ok(data) => Ok(data),
             Err(e) => Err(DecodeError::new(&format!("block error {:?}", e))),
@@ -382,7 +371,7 @@
         qr_data.cardno = String::from("00001252");
         qr_data.cardtype = String::from("80");
 
-        let dali_qrcode = DaliQrCode::new(key, Some(iv), None, None, None).unwrap();
+        let dali_qrcode = DaliQrCode::new(key, Some(iv), Some(60u64), Some(5u8), None).unwrap();
 
         match dali_qrcode.encode(&mut qr_data, 0) {
             Ok(qrcode) => {
diff --git a/dlsmk/Cargo.toml b/dlsmk/Cargo.toml
index 76c2eaa..48e7107 100644
--- a/dlsmk/Cargo.toml
+++ b/dlsmk/Cargo.toml
@@ -13,7 +13,7 @@
 crate-type = ["cdylib"]
 
 [dependencies]
-jni = "0.18.0"
+jni = { version = "0.18.0", default-features = false }
 dlqrcode = { path = "../dlqrcode" }
 libc = "0.2.80"
 hex = "0.4.2"
diff --git a/java/src/main/java/com/supwisdom/dlsmk/DLSMKQrCode.java b/java/src/main/java/com/supwisdom/dlsmk/DLSMKQrCode.java
index e9ee765..257ba7b 100644
--- a/java/src/main/java/com/supwisdom/dlsmk/DLSMKQrCode.java
+++ b/java/src/main/java/com/supwisdom/dlsmk/DLSMKQrCode.java
@@ -6,5 +6,13 @@
     static {
         System.loadLibrary("dlsmk");
     }
-    public static native boolean decode(String keyHex,String qrcodeBase64, Long offset, Map<Object, Object> result);
+    /**
+     * @param keyHex - 主密钥， HEX 格式
+     * @param qrcodeBase64 - 二维码数据
+     * @param secsOffset - 市民卡平台与App的时间差，单位秒，可以为负数
+     * @param result - 结果 , key in [cardno, cardtype, error]
+     * @return - true 成功，false 失败
+     */
+    public static native boolean decode(String keyHex,String qrcodeBase64, 
+                                        Long secsOffset, Map<Object, Object> result);
 }
