优化代码
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);
 }