PHP FFI-将数组Rust函数返回到PHP

佐林巴

我需要从rust函数返回一些值。试图声明返回数组的函数

$ffi = FFI::cdef('float get_arr()[2];', './target/release/libphp_rust.dylib');

$array = $ffi->get_arr();

但是有一个错误: PHP Fatal error: Uncaught FFI\ParserException: function returning array is not allowed at line 1 in /array.php:3

似乎PHP FFI无法直接使用数组。所以我找到了另一个解决方案。我从PHP创建了C数组,然后将其指针传递给Rust代码,然后使用Rust函数进行填充:

$ffi = FFI::cdef('bool get_arr(float (*res)[2]);', './target/release/libphp_rust.dylib');

$array = $ffi->new('float[2]');

$result = $ffi->get_arr(FFI::addr($array));

if ($result) {
    var_dump($array);
} else {
    //... something went wrong
}
#[no_mangle]
pub extern fn get_arr(array_pointer: *mut [f32;2]) -> bool {
    let res = unsafe {
        assert!(!array_pointer.is_null());
        &mut *array_pointer
    };

    res[0] = 0.1;
    res[1] = 0.2;

    return true;
}

这个解决方案似乎工作正确,但是我对此有些怀疑:

  1. 传递指向FFI的指针是否足够安全,将来我可能会遇到什么问题?
  2. Rust数组是否完全与C兼容,以便我能够通过索引直接为其赋值?
  3. 我有更好的方法来实现我所需要的吗?也许有一些关于通过FFI传递复杂数据结构的良好实践?

谢谢

编码器256

围绕此的规则仍然悬而未决,因此您的示例无疑是安全的。可以,但是需要每晚进行以下功能:

#![feature(maybe_uninit_extra)]
#![feature(ptr_as_uninit)]

// Make sure you use `extern "C"`. `extern` alone means `extern "Rust"`.
#[no_mangle]
pub extern "C" fn get_arr(array_pointer: *mut [f32; 2]) -> bool {
    let fat: *mut [f32] = array_pointer;
    let res = unsafe { fat.as_uninit_slice_mut().unwrap() };

    res[0].write(0.1);
    res[1].write(0.2);

    true
}

在稳定的频道上,它不太优雅:

// Make sure you use `extern "C"`. `extern` alone means `extern "Rust"`.
#[no_mangle]
pub extern "C" fn get_arr(array_pointer: *mut [f32; 2]) -> bool {
    assert!(!array_pointer.is_null());
    unsafe {
        let res = array_pointer as *mut f32;
        res.add(0).write(0.1);
        res.add(1).write(0.2);
    }

    true
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将MySQL表值从PHP脚本返回到Javascript函数-实时绘图

来自分类Dev

const指针的Rust FFI签名转换

来自分类Dev

在lua中调用动态ffi函数

来自分类Dev

如何将数组从php返回到javascript中的ajax响应

来自分类Dev

将PHP数组返回到javascript wihout Ajax,可能吗?

来自分类Dev

为什么我不能在PHP FFI中的结构上使用字,字节?但是char,int和short作品呢?

来自分类Dev

将LuaJIT FFI结构转换为表

来自分类Dev

如何通过C-FFI从Rust调用Nim函数?

来自分类Dev

在PHP 7.4中使用FFI加载库时出现问题

来自分类Dev

Ruby FFI回调返回值

来自分类Dev

dart:ffi的void函数

来自分类Dev

函数返回数组PHP

来自分类Dev

php-ffi:分配结构的char *

来自分类Dev

带Windows CryptoUnprotectData的Rust FFI

来自分类Dev

为什么我不能在PHP FFI中的结构上使用字,字节?但是char,int和short作品呢?

来自分类Dev

如何将数组从PHP返回到Javascript

来自分类Dev

$ .get将json_encoded php数组返回到javascript

来自分类Dev

const指针的Rust FFI签名转换

来自分类Dev

将记录传递给ffi

来自分类Dev

从php文件将json返回到ajax

来自分类Dev

节点ffi结构变量数组

来自分类Dev

PHP函数将多个数组值返回到字符串

来自分类Dev

将LuaJIT FFI结构转换为表

来自分类Dev

从Rust FFI访问DPDK中的静态C函数

来自分类Dev

如何将数组从ac#dll返回到php

来自分类Dev

无法将数组从 php 函数返回到 ajax 请求

来自分类Dev

将数组从 C++ 返回到 Rust FFI 中的 Rust

来自分类Dev

将数组从 PHP 返回到 jQuery 从 Ajax

来自分类Dev

如何将数据从 PHP 返回到 ajax 函数

Related 相关文章

热门标签

归档