优化 ffi 处理
diff --git a/dlqrcode/src/lib.rs b/dlqrcode/src/lib.rs
index 81cbe91..8a98de0 100644
--- a/dlqrcode/src/lib.rs
+++ b/dlqrcode/src/lib.rs
@@ -293,7 +293,6 @@
}
}
-
pub fn transaction_sign(qrdata: &DaliQrData) -> String {
let sign_str = qrdata.to_qrdata();
let key = Aes256Cbc::new_var(MASTER.as_bytes(), &MASTER_IV).unwrap();
@@ -334,7 +333,6 @@
Ok(tac)
}
-
#[cfg(test)]
mod tests {
use super::*;
diff --git a/dlsmk/src/lib.rs b/dlsmk/src/lib.rs
index 14538d9..909632f 100644
--- a/dlsmk/src/lib.rs
+++ b/dlsmk/src/lib.rs
@@ -42,9 +42,7 @@
use self::jni::objects::{JClass, JMap, JObject, JString};
use self::jni::sys::{jboolean, jint, jlong, jstring, JNI_FALSE, JNI_TRUE};
use self::jni::JNIEnv;
- // use super::*;
- use libc;
- use std::slice;
+ use std::ffi::CStr;
use log::debug;
@@ -72,10 +70,7 @@
.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
+ String::from(CStr::from_ptr(s).to_string_lossy())
};
let qrcode = {
@@ -83,17 +78,14 @@
.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
+ String::from(CStr::from_ptr(s).to_string_lossy())
};
let qrdata = env.get_map(result).expect("invalid qrdata map");
let (key, step, skew) = {
let mut k = [0u8; 32];
- if let Ok(v) = base64::decode_config(key.as_slice(), base64::URL_SAFE) {
+ if let Ok(v) = base64::decode_config(key, base64::URL_SAFE) {
if v.len() != 35 {
put_data(&env, &qrdata, "error", "key format error");
return JNI_FALSE;
@@ -123,6 +115,7 @@
}
};
+
match decoder.decode(qrcode.as_ptr(), qrcode.len(), offset as i32) {
Ok(d) => {
put_data(&env, &qrdata, "cardno", &d.cardno);
@@ -143,9 +136,13 @@
const VERSION: &'static str = env!("CARGO_PKG_VERSION");
#[no_mangle]
- pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_version(env: JNIEnv,
- _: JClass) -> jstring {
- let s = env.new_string(String::from(VERSION)).expect("would't get version");
+ pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_version(
+ env: JNIEnv,
+ _: JClass,
+ ) -> jstring {
+ let s = env
+ .new_string(String::from(VERSION))
+ .expect("would't get version");
s.into_inner()
}
@@ -161,16 +158,14 @@
) -> jboolean {
let qrsign = {
let s = env.get_string(qrsign).expect("invalid key string").as_ptr();
- let keylen = libc::strlen(s);
- String::from_raw_parts(s as *mut u8, keylen, keylen)
+ String::from(CStr::from_ptr(s).to_string_lossy())
};
let cardno = {
let s = env
.get_string(cardno)
.expect("invalid cardno string")
.as_ptr();
- let len = libc::strlen(s);
- String::from_raw_parts(s as *mut u8, len, len)
+ String::from(CStr::from_ptr(s).to_string_lossy())
};
let termDatetime = {
@@ -178,8 +173,7 @@
.get_string(termDatetime)
.expect("invalid datetime")
.as_ptr();
- let len = libc::strlen(s);
- String::from_raw_parts(s as *mut u8, len, len)
+ String::from(CStr::from_ptr(s).to_string_lossy())
};
let result = env.get_map(result).expect("invalid qrdata map");
@@ -189,7 +183,12 @@
return JNI_FALSE;
}
- match dlqrcode::transaction_tac(&cardno, amount, &termDatetime, &qrsign) {
+ match dlqrcode::transaction_tac(
+ &cardno,
+ amount,
+ &termDatetime,
+ &qrsign
+ ) {
Ok(tac) => {
put_data(&env, &result, "tac", &tac);
JNI_TRUE