先看C层的函数申明以及部分实现
int getChangeFromMasterPrivKey(const char *masterPrivKey, COIN_TYPE coin, char *changePubKey, char *changePrivKey);
部分实现,注意指针参数判断空
int getChildFromPubPrivKey(const char * changePubKey, unsigned int path, char * childPubKey) {
if (!childPubKey || !changePubKey) {
return -10;
}
}
接下来是rust的ffi函数申明
extern "C" {
pub fn getChangeFromMasterPrivKey(masterPrivKey:*const u8,coin:u64,changePubKey:*mut u8,changePrivKey:*mut u8) -> c_int;
}
rust调用ffi函数
let master_priv = master_priv.as_ptr();
let mut changePub:[c_char;150] = [0;150];
let mut changePriv:[c_char;150] = [0;150];
unsafe {
let result = ffi::getChangeFromMasterPrivKey(master_priv,
coin_type,
changePub.as_mut_ptr() as *mut u8,
changePriv.as_mut_ptr() as *mut u8);
info!("result {}",result);//这里的结果为-10,即rust传入的参数changePubKey,changePrivKey指针为null
}
上述代码发现Android 上有问题,但是iOS没有问题,试过将指针改为box堆分配也一样的结果
// let mut changePub = Box::new([0; 150]);
// let mut changePriv = Box::new([0; 150]);
暂时无解了,ffi裸指针使用有啥坑吗?
1
共 5 条评论, 1 页
评论区
写评论nice。
问题解决了,正如你说的和编译环境有关系,rust的ffi中 coin:u64改为coin:u32位就行,因为取值就是0x80000000这样的,u32够了,因为测试的Android编译的是armeabi-v7a,32位的,导致取参数出问题。自己把自己坑到了。。。
master_priv 之前是什么东东?你检查过传入前他的值吗?另外,你怎么编译的。
不是这原因,*mut u8代表char *这个没问题,可能是生命周期哪儿不对?
--
👇
cutepig123: unsigned int在rust里应该是c_uint吧
https://doc.rust-lang.org/std/os/raw/index.html
unsigned int在rust里应该是c_uint吧
https://doc.rust-lang.org/std/os/raw/index.html