如何在JS中创建char**变量以适配ffi-napi调用DLL函数的入参要求
解决方法
你遇到的char**类型入参通常是C函数用于输出字符串的场景:C侧会把生成的RRN字符串的首地址写到你传入的char*指针的内存地址中,所以你需要通过ref-napi申请一块能存储char*指针的内存空间,也就是char**。
步骤1 修正ffi定义的错误
你现有的ffi调用定义有两处错误需要先修正:
- 导出函数名要和C侧一致,C侧定义的函数名为
PPRRN,不是PosPurchaseRRN - ffi定义的参数列表为参数类型集合,不能直接写变量名
myobjPtr,第一个参数是类指针,类型填pointer即可
修正后的ffi定义代码:
var ref = require("ref-napi"); var ffi = require("ffi-napi"); var MyLibrary = ffi.Library('./AxECR98.so', { // 函数名匹配C侧的PPRRN,参数类型依次对应:ulong返回值,[类指针, char**, double, double] "PPRRN": ["ulong", ["pointer", "char**", "double", "double"]] });
步骤2 创建char**类型变量并调用
// 1. 申请char**类型的内存空间:本质是申请一块能存储char*指针的内存 const rrnPtrPtr = ref.alloc('char*') // 等价于char** 类型变量 // 2. 调用函数,传入对应的参数(myobjPtr是你提前创建好的CAxECRClass98实例指针) const totalAmount = 100.0 // 替换为你的实际交易金额 const addAmount = 0.0 // 替换为你的实际附加金额 const ret = MyLibrary.PPRRN(myobjPtr, rrnPtrPtr, totalAmount, addAmount) // 3. 调用成功后读取返回的RRN字符串 if (ret == 0) { // 假设返回0为调用成功,根据实际接口文档判断返回值含义 // 先解引用char**拿到char*,再把char*转成JS字符串 const rrnStr = ref.readCString(ref.deref(rrnPtrPtr)) console.log('获取到的RRN为:', rrnStr) // 注意:如果C侧的字符串是通过malloc动态申请的内存,调用完需要调用C侧提供的释放接口释放对应的char*内存,避免内存泄漏 }
注意事项
- 如果C接口要求你提前分配字符串内存再传入,你需要先申请对应长度的char数组,再取其指针的引用作为
char**传入,具体逻辑需要参考该DLL的官方接口文档 - 跨语言调用结束后一定要注意内存释放,避免出现内存泄漏问题
内容的提问来源于stack exchange,提问作者BRAiNPet
相关产品推荐
相关产品推荐

