diff --git a/dlsmk/src/lib.rs b/dlsmk/src/lib.rs
new file mode 100644
index 0000000..402a0c0
--- /dev/null
+++ b/dlsmk/src/lib.rs
@@ -0,0 +1,108 @@
+#[cfg(test)]
+mod tests {
+    #[test]
+    fn it_works() {
+        assert_eq!(2 + 2, 4);
+    }
+}
+
+// use std::ffi::{CStr, CString};
+// use std::os::raw::{c_char, c_uchar, c_ulong};
+
+// #[no_mangle]
+// pub extern "C" fn dlsmk_decode(
+//     key: *const c_uchar,
+//     qrcode: *const c_uchar,
+//     qrlen: c_ulong,
+// ) -> *mut c_char {
+//     CString::new("Hello ".to_owned()).unwrap().into_raw()
+// }
+
+// #[cfg(target_os = "android")]
+#[cfg(any(target_family = "unix", target_os = "android"))]
+// #[cfg(target_family = "unix")]
+#[allow(non_snake_case)]
+pub mod android {
+    extern crate jni;
+
+    use self::jni::objects::{JClass, JObject, JString};
+    use self::jni::sys::{jboolean, jlong, JNI_FALSE, JNI_TRUE};
+    use self::jni::JNIEnv;
+    // use super::*;
+    use libc;
+    use std::slice;
+
+    use dlqrcode::DaliQrCode;
+
+    #[no_mangle]
+    pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_decode(
+        env: JNIEnv,
+        _: JClass,
+        key_hex: JString,
+        qrcode: JString,
+        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
+            } else {
+                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),
+        };
+
+        println!("decode qrcode begin , length : {}...", qrlen);
+        match decode.decode(qrcode as *const u8, qrlen, offset as i32) {
+            Ok(d) => {
+                let qrdata = env.get_map(result).expect("invalid qrdata map");
+                qrdata
+                    .put(
+                        *env.new_string("cardno").unwrap(),
+                        *env.new_string(d.cardno).unwrap(),
+                    )
+                    .unwrap();
+                qrdata
+                    .put(
+                        *env.new_string("cardtype").unwrap(),
+                        *env.new_string(d.cardtype).unwrap(),
+                    )
+                    .unwrap();
+                qrdata
+                    .put(
+                        *env.new_string("uid").unwrap(),
+                        *env.new_string(d.uid).unwrap(),
+                    )
+                    .unwrap();
+                return JNI_TRUE;
+            }
+            Err(e) => {
+                println!("Error {:?}", e);
+                return JNI_FALSE;
+            },
+        };
+    }
+}
