cppjieba

使用PHP的FFI调用cjieba分词的动态库

心不动则不痛 提交于 2020-12-09 00:25:25
选用CJieba的原因是FFI使用的是C的调用约定,如果用Cpp,还得自己包装一下,然后extern C,让编译器生成标准C的动态库。 碰到的问题 段错误 C变量没有初始化 直接调用了C的函数,没有通过FFI 初始化后的的C对象调用 非空判断 需要使用 FFI::isNull($x) 指针形式的数组 不能用foreach 指针形式数组的循环 查看C代码发现Cut部分如下: CJiebaWord* Cut(Jieba handle, const char* sentence, size_t len) { cppjieba::Jieba* x = (cppjieba::Jieba*)handle; vector words; string s(sentence, len); x->Cut(s, words); CJiebaWord* res = (CJiebaWord*)malloc(sizeof(CJiebaWord) * (words.size() + 1)); size_t offset = 0; for (size_t i = 0; i < words.size(); i++) { res[i].word = sentence + offset; res[i].len = words[i].size(); offset += res[i].len; } if (offset !