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

时间:2018-11-12 12:02:28

标签: java c java-native-interface

通过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时,是否需要做一些特殊的事情?该文档对此不太清楚。

我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的示例应该可以使用,但是它过于简单了,我怀疑您遗漏了一些关键的内容,能否请您更准确地说明问题?

我会在没有更多上下文的情况下进行猜测,我肯定处于类似情况并且有一些想法。

我有兴趣了解如何用c ++或java构造java对象?在func1(),func2()和func3()之间使用的对象实例化之间有区别吗?