使用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
相关产品推荐
相关产品推荐

