【问题标题】:Calling JNI functions from a const method从 const 方法调用 JNI 函数
【发布时间】:2015-10-21 13:31:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • 由于某种原因你有const JNIEnv*吗?为什么?
  • 扩展@TavianBarnes 的评论:您可以在对象中保留指向JNIEnv 的指针,但您无法控制JNIEnv,它不属于您的对象或类。因此,将其声明为 mutable 是完全合法的。

标签: java android c++ java-native-interface


【解决方案1】:

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

【讨论】:

  • 感谢您的回答,我终于决定从与 JNI 一起使用的方法中删除 const 属性。
【解决方案2】:

除了 JNI,你想在 const one 中调用 non-const 方法。

我认为您可以使用const_cast<> 来完成此操作,但请先阅读details

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多