通过JNI在C和Java之间来回调用时,我遇到了一个奇怪的堆栈问题。
我们的代码混合了C和Java模块,可以使用JNI相互调用。
发生以下情况时似乎已经出现了我的问题;
C模块(CA.c)调用Java模块(JA.java),后者调用C模块(CB.c),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)。另外,在func3()工作之后,将对func1()和func2()中的CallJavaViaJNI()进行调用。
这只是一个例子,堆栈上可能有比这更多的功能。看起来好像JNI一旦堆栈中有太多东西就停止工作。该函数从堆栈弹出后,一切又开始工作。
我试过在ExceptionCheck()返回true之后调用ExceptionDescribe(),但没有任何帮助。清除异常并重试会导致相同的结果。
这与JNI的初始化有关吗?我是否需要指定堆栈大小或其他一些参数?
从C调用的Java模块中调用C时,是否需要做一些特殊的事情?该文档对此不太清楚。
我将不胜感激。
答案 0 :(得分:0)
您的示例应该可以使用,但是它过于简单了,我怀疑您遗漏了一些关键的内容,能否请您更准确地说明问题?
我会在没有更多上下文的情况下进行猜测,我肯定处于类似情况并且有一些想法。
我有兴趣了解如何用c ++或java构造java对象?在func1(),func2()和func3()之间使用的对象实例化之间有区别吗?