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

使用JNA从Java访问C++结构体时遇链接错误求助

问题分析与解决

1. 编译命令的文件名大小写错误

Ubuntu系统(包括WSL2)是大小写敏感的,你的C++源文件名为MyStruct.cpp,但编译时使用的命令是:

g++ -v -shared -o libmycpplib.so my_struct.cpp

这里的my_struct.cpp和实际文件名MyStruct.cpp大小写不匹配,导致编译器没有编译到包含getStruct函数的代码,生成的libmycpplib.so库中根本不存在getStruct符号,因此JNA报错找不到该函数。

修正后的编译命令:

g++ -v -shared -o libmycpplib.so MyStruct.cpp

2. 结构体类型不匹配

Java代码中MyStruct的y字段定义为int类型,但C++代码中对应的y是double类型,类型不匹配会导致后续读取到错误的数值。

修正Java结构体定义:

@FieldOrder({"x", "y"})
class MyStruct extends Structure {
    public int x;
    public double y; // 改为double类型,与C++结构体一致
}

3. 额外注意事项

C++中getStruct返回的是结构体指针,JNA的Structure可以自动处理指针返回值,但如果后续出现内存泄漏或读取异常,可以考虑将接口方法的返回类型改为MyStruct.ByReference,明确表示返回指针:

MyStruct.ByReference getStruct();

在使用时可以直接访问字段获取数据。

内容的提问来源于stack exchange,提问作者H3007

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:59:56