从const方法调用JNI函数

时间:2015-08-14 06:19:23

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

我想调用我的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属性是解决此问题的唯一方法吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

除了JNI之外,你想在 const 一个中调用非const 方法。

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

答案 2 :(得分:1)

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