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

Java应用通过JNI桥调用Windows DLL时因JNIWrapper异常冻结

解决Java应用因JNIWrapper调用不存在方法导致的冻结问题

这个错误的核心原因很明确:你使用的jniwrap-3.8.4.jar在Library.unloadNativeCode()方法中,错误地尝试调用一个并不存在的方法java.lang.System.getCallerClass(),从而抛出NoSuchMethodException。这个异常在NativeResourceCollector的后台线程中触发后,导致线程卡住,最终让整个应用冻结。

为什么会出现这个问题?

getCallerClass()这个方法其实属于sun.reflect.Reflection类(Java 8中的内部API),而非java.lang.System。jniwrap 3.8.4版本的代码里存在类名调用错误,导致找不到目标方法抛出异常。另外,即使调用正确的Reflection.getCallerClass(),在Java 8中它也是标记为废弃的内部API,普通应用类调用它也可能因权限限制出问题,但这里的直接诱因是方法的归属类找错了。

具体解决方案

  • 优先方案:升级JNIWrapper库
    这个方法名调用错误应该已经在后续版本的JNIWrapper中被修复。你可以下载最新稳定版(比如3.8.5及以后版本),替换项目中的jniwrap-3.8.4.jar后重新运行应用。这是最稳妥、最推荐的解决方式,同时还能获得其他bug修复和性能优化。

  • 应急临时方案:修改JNIWrapper代码(仅用于无法升级的场景)
    如果你暂时无法升级库,可以反编译jniwrap-3.8.4.jar中的com.jniwrapper.Library类,找到unloadNativeCode()方法里调用Class.getDeclaredMethod("getCallerClass")的代码行,将调用的类从System.class改为sun.reflect.Reflection.class,再重新打包成jar文件。注意这种方式会破坏库的完整性,后续有升级机会一定要替换为官方版本。

  • 另一个临时方案:禁用自动资源收集
    查看JNIWrapper的官方文档,确认是否有配置参数可以关闭NativeResourceCollector的自动运行。如果能禁用这个后台线程,就能避开触发错误的代码路径,让应用暂时正常运行。不过这可能导致本地资源无法自动释放,需要你手动管理DLL的加载和卸载,要注意内存泄漏风险。


内容的提问来源于stack exchange,提问作者Pubudu Mahesh Meththananda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:32:35