当我从C ++调用Java Method时,我应该调用PushLocalFrame和PopLocalFrame吗?

时间:2016-03-24 04:10:49

标签: java c++ java-native-interface

问题1: 我有一个带有静态方法的java类:

class Test {
    static public void show (String value) {
        // dosomething with value 
    }
}

如果我想从c ++调用它:

jstring value = env->NewStringUTF("Hello, World");
// ExceptionCheck after NewStringUTF.
env->CallStaticVoidMethod(the_jclass, the_jmethodID, value);
// ExceptionCheck after CallStaticVoidMethod.

我应该在 NewStringUTF 之前放置 PushLocalFrame ,并在 CallStaticVoidMethod 之后放置 PopLocalFrame 以释放本地参考?

问题2:

我看到了 PopLocalFrame 的声明,它是:

jobject PopLocalFrame(JNIEnv *env, jobject result);

阅读完jni文档后,我仍然无法理解为什么PopLocalFrame需要结果参数返回值。你能给我一个例子来说明它的存在价值吗?

1 个答案:

答案 0 :(得分:3)

  

我应该在PushLocalFrame之前放置NewStringUTF并在PopLocalFrame之后放置CallStaticVoidMethod来发布本地参考资料吗?

在这个特殊情况下,我没有看到这一点。您只需使用DeleteLocalRef删除本地参考,而不是创建新的本地参考框架。

  

我仍然无法理解为什么PopLocalFrame需要结果参数和返回值

假设您使用PushLocalFrame创建了一个新的本地参考框架,并且您希望删除在该框架上创建的所有本地参考,但除了您要保留的一个参考(例如你创建了一些你想从函数中返回的对象。) 您可以通过将要保留的引用传递给PopLocalFrame来实现此目的,并且您获得的值是对前一个本地引用框架(现在是当前引用框架)中该对象的引用。