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

Should I call PushLocalFrame and PopLocalFrame when I call Java Method From C++?

本文关键字:调用 PushLocalFrame 我应该 PopLocalFrame 方法 C++ Java      更新时间:2023-10-16

问题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.

我是否应该将PushLocalFrame放在NewStringUTF之前,并将PopLocalFrame放置在CallStaticVoidMethod之后,以释放本地引用?

问题2:

我看到PopLocalFrame的声明,它是:

jobject PopLocalFrame(JNIEnv *env, jobject result);

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

我应该在NewStringUTF之前放PushLocalFrame,在CallStaticVoidMethod之后放PopLocalFrame来发布本地引用吗?

在这种特殊情况下,我看不出有什么意义。您可以使用DeleteLocalRef来删除本地参照,而不是创建新的本地参照系。

我仍然不明白为什么PopLocalFrame需要一个结果参数和一个返回值

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