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

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

问题一: 我有一个 java class 和静态方法:

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需要一个结果参数和一个return值.能否举个例子说明它的存在价值?

Should I put PushLocalFrame before NewStringUTF and put PopLocalFrame after CallStaticVoidMethod to release local references?

在这种特殊情况下,我不明白这一点。您可以只使用 DeleteLocalRef 删除本地参考,而不是创建新的本地参考系。

I still can't understand why PopLocalFrame needs a result parameter and a return value

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