当通过JNI在C和Java之间来回调用时,我遇到了一个奇怪的堆栈问题。
我们的代码是C和Java模块的混合体,它们可以使用JNI相互调用。
当发生以下情况时,我遇到的问题似乎就发生了;
C模块(CA.C(调用Java模块(JA.Java(,后者调用C模块(CB.C(,后者尝试调用Java模块,但失败了(JB.Java(
CB确实进行了一些成功工作的Java调用,但是一旦堆栈上有一定数量的函数,JNI似乎就会开始失败:
CB.c
func1() {
CallJavaViaJNI(); //Works fine
func2();
CallJavaViaJNI(); //Works fine
}
func2() {
CallJavaViaJNI(); //Works fine
func3();
CallJavaViaJNI(); //Works fine
}
func3() {
CallJavaViaJNI(); //Fails
}
在上面的例子中,当从func1((和func2((调用时,对CallJavaViaJNI((的调用将成功,但在func3((中失败(jnienv->ExceptionCheck((返回true(。此外,在func1((和func2((中,在func3((之后对CallJavaViaJNI((的调用也起作用。
这只是一个例子,堆栈上的函数可能比这个多得多。似乎JNI在堆栈上有这么多内容后就停止了工作。在函数从堆栈中弹出后,事情又开始工作了。
我试过在ExceptionCheck((返回true后调用ExceptionDescribe((,但我一无所获。清除异常并重试同样的结果。
这与JNI的初始化有关吗?我需要指定堆栈大小或其他参数吗?
当从从C调用的Java模块回调到C时,有什么特别的事情需要做吗?文件对此不是很清楚。
如果有任何帮助或建议,我将不胜感激。
你的例子应该有效,但它太简单了,我怀疑你遗漏了一些关键的东西,你能发布一个更准确的问题说明吗?
如果没有更多的上下文,我会犹豫是否猜测,但是,我肯定也遇到过类似的情况,并且有一些想法。
我很想看看你是如何用c++还是java构建你的java对象的?func1((、func2((和func3((之间正在使用的对象实例化之间是否存在差异?