我有一个本机应用程序,它可以启动JVM并通过JNI API与之交互。 本机应用程序构造一个(复杂的)JVM对象,并将其作为参数传递给方法调用。 问题在于,在某些情况下,对于确定的输入,JVM在执行以下方法时会崩溃:
Exception in thread "Thread-1" java.lang.IncompatibleClassChangeError
我了解到,当对不了解更改的客户端使用的类进行了一些不兼容的二进制更改时,JVM将抛出此异常。但是,我看不到这种情况如何发生:就我而言,JVM在类路径中只有一个胖子。我在其中找不到重复的类,并且总是编译客户端代码以生成胖罐子。
在“ What causes java.lang.IncompatibleClassChangeError?”上,我发现还有另一个潜在原因:一种通过JNI调用的方法,其对象类型错误,例如顺序错误。因此,我用IsInstanceOf
添加了动态检查,以检查传递给JVM的任何对象的类型。不幸的是,所有检查都成功。
我该如何调试?该异常没有消息(例如,没有“ Expected non-static field ChildClass.message”之类的消息)。这可能暗示这是由JNI引起的问题,而不是由库中二进制更改不兼容的“更常见”情况引起的。
我尝试了-verbose:class
,但在日志中没有看到任何奇怪的东西。最后加载的类似乎是常见的Scala lambda函数,没什么奇怪的:
[Loaded a.b.c.FastPrettyPrinter$$$Lambda$457/868352876 from a.b.c.FastPrettyPrinter$]
是否有一个详尽的列表或说明,说明通过JNI调用JVM方法 时可能引起IncompatibleClassChangeError
的原因?