You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:06:04