当我从C++调用Java方法时,我应该调用PushLocalFrame和PopLocalFrame吗
Should I call PushLocalFrame and PopLocalFrame when I call Java Method From C++?
问题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
来实现这一点,并且您得到的值是对上一个局部参照系(现在是当前参照系)中该对象的引用。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用