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

标签 java c++ java-native-interface

问题一: 我有一个带有静态方法的 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 之后以释放本地引用?

问题二:

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

jobject PopLocalFrame(JNIEnv *env, jobject result);

看了jni的文档,还是不明白为什么PopLocalFrame需要一个结果参数和一个返回值。能否举个例子说明它的存在值(value)?

最佳答案

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 创建了一个新的本地引用帧,并且您想要删除在该帧上创建的所有本地引用除了您想要删除的一个引用keep(例如,您创建了一些要从函数返回的对象)。
您可以通过将要保留的引用传递给 PopLocalFrame 来实现此目的,您返回的值是对先前本地引用帧(现在是当前帧)中该对象的引用。

关于java - 当我从 C++ 调用 Java 方法时,我应该调用 PushLocalFrame 和 PopLocalFrame 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36193158/

相关文章:

java - 使用 Spring WebClient 响应式读取行

java - Gradle : Could not find org. codehaus.groovy :groovy:1. 0.0

c++ - 将 CMake 项目添加到 Visual Studio 解决方案

c++ - 在类中组织函数

c++ - 如何在 GCC 主干中使用 <stacktrace>?

java - 通过纯原生 Android 应用检索 android.os.Build.... 系统属性

java - 出现 fatal error : jni. h : No such file or directory #include <jni. h>

java - 如何使用 Spring Data JPA 查询更新 PostgreSQL 中的 JSONB 列

java - 为什么HttpRequest在第二次读取时返回NULL?

通过 OLEDB Jet 4.0 (dBase IV) 连接数据库的 Java JNI 调用 dll 与 Borland Database Engine (BDE) 在 JRE 7 环境中崩溃