我也试图在PHP中使用我的C ++类。在我的C ++代码中,我已将typedef声明为:
typedef unsigned char byte;
所以我打算让SWIG在包装类中考虑我的typedef,我的接口文件是这样的:
%module xxx
typedef unsigned char byte;
%include "xxx.h"
....
%{
typedef unsigned char byte;
#include "xxx.h"
%}
在我的测试代码中,我将类型命名为:
byte *data;
但我遇到以下错误:
Fatal error: Class 'unsigned_char' not found in xxx.php
P.S:我的界面文件中也包含“stdint.i”,但出现了同样的错误
有什么想法吗?
答案 0 :(得分:0)
我可以确认您显示的界面是可行的,适用于简单的情况,例如:我编写了以下头文件进行测试:
byte *make() { return NULL; }
void consume(byte *data) {}
并使用界面:
%module xxx
typedef unsigned char byte;
%include "xxx.h"
%{
typedef unsigned char byte;
#include "xxx.h"
%}
我能够使用以下PHP编译和测试:
<?php
include("xxx.php");
$r = xxx::make();
xxx::consume($r);
?>
它按预期工作。
但要注意的几点:
%{ %}
内的%include
内的位写入。{/ 1}。byte
,而是倾向于使用其中一种标准的int类型,例如: uint8_t
您的问题并不清楚您打算如何使用byte *data
- 大概是一个数组,在这种情况下您需要add a little more code到您的界面。 (或者更好的是仍然使用std::vector<byte>
,因为它是C ++):
%module xxx
%{
typedef unsigned char byte;
#include "xxx.h"
%}
%include <carrays.i>
%array_class(byte,ByteArray);
typedef unsigned char byte;
%include "xxx.h"
然后可以在PHP中使用:
$a = new ByteArray(100);
$a->setitem(0, 1);
$a->setitem(1, 2); //...
xxx::consume($a->cast());
ByteArray
是SWIG提供的实用程序类,用于保存和包装byte
s的原始C数组。