Xtext项目JNI调用C++函数出现UnsatisfiedLinkError问题
问题排查与解决步骤
1. 先核对包名与JNI函数签名一致性
你报错信息中的方法全限定名为com.example.validation.DummyValidator.print(),但你的JNI头文件中函数名对应的类是com.example.dummy_validation.DummyValidator(对应包名com.example.dummy.validation),二者包名不匹配:
- 确认运行时的
DummyValidator类的包名和生成JNI头文件时用的类包名完全一致 - 如果包名有修改,重新生成JNI头文件,再重新编译C++库
2. 解决OSGi类加载隔离问题
Xtext运行在Eclipse OSGi容器中,默认存在类加载器隔离,原生库被系统类加载器加载后,OSGi的Bundle类加载器无法关联到native方法绑定,这是插件场景JNI调用失败的最常见原因,按如下步骤修改:
- 打开插件项目下
META-INF/MANIFEST.MF,添加Bundle-NativeCode配置声明原生库,示例:
Bundle-NativeCode: dummy_validator/Debug/libdummy_validator.so; osname=linux; processor=x86-64, dummy_validator/Debug/dummy_validator.dll; osname=win32; processor=x86-64
路径替换为你的库文件在插件项目中的相对路径,根据实际操作系统、CPU架构调整参数。
2. 删除DummyValidator类中static { System.loadLibrary("dummy_validator"); }代码块,OSGi会在Bundle启动时自动加载对应平台的原生库,并且和当前Bundle的类加载器绑定,解决方法找不到的问题。
3. 兜底验证方案
如果需要快速排查问题,可以用绝对路径加载库,排除路径搜索相关的问题:
static { // 替换为你的原生库的绝对路径 System.load("/home/xxx/project/dummy_validator/Debug/libdummy_validator.so"); }
内容的提问来源于stack exchange,提问作者harsh
相关产品推荐
相关产品推荐

