< 返回版块

xiazhouquan 发表于 2021-04-08 12:26

Tags:ffi

先看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裸指针使用有啥坑吗?

评论区

写评论
Mike Tang 2021-04-10 02:04

nice。

作者 xiazhouquan 2021-04-09 09:32

问题解决了,正如你说的和编译环境有关系,rust的ffi中 coin:u64改为coin:u32位就行,因为取值就是0x80000000这样的,u32够了,因为测试的Android编译的是armeabi-v7a,32位的,导致取参数出问题。自己把自己坑到了。。。

Mike Tang 2021-04-08 16:17

master_priv 之前是什么东东?你检查过传入前他的值吗?另外,你怎么编译的。

作者 xiazhouquan 2021-04-08 15:31

不是这原因,*mut u8代表char *这个没问题,可能是生命周期哪儿不对?

--
👇
cutepig123: unsigned int在rust里应该是c_uint吧

https://doc.rust-lang.org/std/os/raw/index.html

cutepig123 2021-04-08 13:11

unsigned int在rust里应该是c_uint吧

https://doc.rust-lang.org/std/os/raw/index.html

1 共 5 条评论, 1 页