通过JNI在C和Java之间来回调用



当通过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((之间正在使用的对象实例化之间是否存在差异?

最新更新