Я новичок в ржавчине и пытаюсь обернуть мою жизнь. Пожалуйста, рассмотрите следующий код:
use jni::JNIEnv;
pub struct CameraAppEngine<'a> {
_env: &'a JNIEnv<'a>,
_width: i32,
_height: i32
}
impl<'a> CameraAppEngine<'a> {
pub fn new(_env: &'a JNIEnv<'a>, _width: i32, _height: i32) -> CameraAppEngine {
CameraAppEngine { _env, _width, _height }
}
pub fn env(&'a self) -> JNIEnv<'a> {
JNIEnv::from_raw(self._env).unwrap() // error!
}
}
Метод JNIEnv :: from_raw имеет сигнатуру типа from_raw(ptr: *mut JNIEnv) -> Result<Self>
, поэтому это приводит к ошибке компиляции:
| JNIEnv::from_raw(self._env).unwrap()
| ^^^^^^^^^ types differ in mutability
|
= note: expected raw pointer `*mut *const jni::sys::JNINativeInterface_`
found reference `&'a jni::JNIEnv<'a>`
Затем я попытался JNIEnv::from_raw(self._env as *mut JNIEnv<'a>).unwrap()
, но это приводит к:
| JNIEnv::from_raw(self._env as *mut JNIEnv<'a>).unwrap() // error!
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected *-ptr, found struct `jni::JNIEnv`
|
= note: expected raw pointer `*mut *const jni::sys::JNINativeInterface_`
found raw pointer `*mut jni::JNIEnv<'a>`
error[E0606]: casting `&'a jni::JNIEnv<'a>` as `*mut jni::JNIEnv<'a>` is invalid
--> native_app/src/camera_engine.rs:16:26
|
| JNIEnv::from_raw(self._env as *mut JNIEnv<'a>).unwrap() // error!
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Как мне получить действительный JNIEnv из ссылки в структуре?
Приветствия и спасибо за ваше время!
Обновление
Вот менее хитрый способ демонстрации проблемы.
pub fn create_camera_session(&'a mut self, surface: jobject) {
// error!
let window = ffi::ANativeWindow_fromSurface(self._env as *mut JNIEnv<'a>, surface);
}
В результате:
error[E0606]: casting `&'a jni::JNIEnv<'a>` as `*mut jni::JNIEnv<'a>` is invalid
подпись типа ANativeWindow_fromSurface ANativeWindow_fromSurface(env: *mut JNIEnv, surface: jobject) -> *mut ANativeWindow
.