从 const 方法调用 JNI 函数

Calling JNI functions from a const method

我想这样调用我的 C++ class 的 Java 绑定 :

std::streamsize DataStreamJava::length() const {
  jmethodID m = jni()->GetMethodID(j_dataStream_class_,
                                   "length", "()J");
  return jni()->CallLongMethod(j_dataStream_global_, m);
}

但这是不可能的,因为这些 JNI 调用不是常量。

JNI 是否为常量方法提供常量函数?删除 const 属性是解决此问题的唯一方法吗?

除了 JNI,您想在 const one[=21= 中调用 非常量 方法].

我想你可以先使用 const_cast<>, but read the details

如果 JNI 没有您想要的 const 注释,在这种情况下 mutable 可能实际上是个好主意。将 JNI 成员标记为 mutable 并手动检查逻辑常量。

我认为简短的回答是 "no." 这些 JNI 函数没有 const 版本。下一个问题可能是 "Should there be?" 我认为答案也是 "no." JNI 函数都可能改变 JVM 的状态。 (至少它们都有能力在 JVM 中创建错误,从而改变其内部状态。)我认为 实际上 违反了您的 const 属性隐含的合同 -这不仅仅是 JNI 头文件中的一些设计缺陷。