2015-08-14 3 views
1

Я хочу, чтобы вызвать Java привязок моего C++ класс так:Вызов функции JNI из константный метод

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

Но это не представляется возможным, так как эти JNI звонки не Уст.

Предоставляет ли JNI функции const для методов const? Исключает ли атрибуты const единственный способ решить эту проблему?

+1

По какой-то причине у вас есть 'const JNIEnv *'? Зачем? –

+1

Чтобы расширить комментарий @TavianBarnes: вы можете держать указатель на 'JNIEnv' в своем объекте, но у вас нет никакого контроля над' JNIEnv', он не принадлежит вашему объекту или классу. Поэтому вполне законно объявлять его ** изменчивым **. –

ответ

2

Я думаю, что короткий ответ - «нет». Там нет const версии этих функций JNI. Следующий вопрос, может быть, «Должен ли быть?» Я думаю, что ответ на это тоже «нет». Функции JNI все потенциально изменяют состояние JVM. (Как минимум, у всех есть возможность создать ошибку в JVM, которая меняет свое внутреннее состояние.) Я думаю, что фактически нарушает контракт, подразумеваемый вашим атрибутом const. Это не просто недостаток дизайна в файлах заголовков JNI.

+0

Благодарим за ваш ответ. Наконец, я решил удалить атрибуты const из методов, используемых с JNI. –

1

JNI друг от друга, вы хотите вызвать неконстантных метод внутри сопзИте один.

Я думаю, вы можете сделать это, используя const_cast<>, но сначала прочитайте details.

1

Если JNI не содержит аннотации const, это может быть случай, когда mutable действительно может быть хорошей идеей. Пометьте члены JNI как mutable и проверьте логическую константу вручную.

Смежные вопросы