diff --git a/musikr/src/main/jni/shim/iostream_shim.cpp b/musikr/src/main/jni/shim/iostream_shim.cpp index b28801ea8..101ce7b79 100644 --- a/musikr/src/main/jni/shim/iostream_shim.cpp +++ b/musikr/src/main/jni/shim/iostream_shim.cpp @@ -11,7 +11,7 @@ namespace taglib_shim class WrappedRsIOStream : public TagLib::IOStream { public: - explicit WrappedRsIOStream(rust::Box stream); + explicit WrappedRsIOStream(RsIOStream *stream); ~WrappedRsIOStream() override; // TagLib::IOStream interface implementation @@ -29,10 +29,10 @@ namespace taglib_shim bool isOpen() const override; private: - rust::Box rust_stream; + RsIOStream *rust_stream; }; - WrappedRsIOStream::WrappedRsIOStream(rust::Box stream) : rust_stream(std::move(stream)) {} + WrappedRsIOStream::WrappedRsIOStream(RsIOStream *stream) : rust_stream(stream) {} WrappedRsIOStream::~WrappedRsIOStream() = default; @@ -154,9 +154,9 @@ namespace taglib_shim } // Factory function to create a new RustIOStream - std::unique_ptr wrap_RsIOStream(rust::Box stream) + std::unique_ptr wrap_RsIOStream(RsIOStream *stream) { - return std::unique_ptr(new WrappedRsIOStream(std::move(stream))); + return std::unique_ptr(new WrappedRsIOStream(stream)); } } // namespace taglib_shim \ No newline at end of file diff --git a/musikr/src/main/jni/shim/iostream_shim.hpp b/musikr/src/main/jni/shim/iostream_shim.hpp index 839be0161..2b4c3a452 100644 --- a/musikr/src/main/jni/shim/iostream_shim.hpp +++ b/musikr/src/main/jni/shim/iostream_shim.hpp @@ -12,5 +12,5 @@ struct RsIOStream; namespace taglib_shim { // Factory functions with external linkage - std::unique_ptr wrap_RsIOStream(rust::Box stream); + std::unique_ptr wrap_RsIOStream(RsIOStream *stream); } // namespace taglib_shim \ No newline at end of file diff --git a/musikr/src/main/jni/src/taglib/bridge.rs b/musikr/src/main/jni/src/taglib/bridge.rs index ed937da1e..e5290718f 100644 --- a/musikr/src/main/jni/src/taglib/bridge.rs +++ b/musikr/src/main/jni/src/taglib/bridge.rs @@ -51,8 +51,8 @@ mod bridge_impl { #[namespace = "TagLib"] #[cxx_name = "IOStream"] type CPPIOStream<'io_stream>; - fn wrap_RsIOStream<'io_stream>( - stream: Box>, + unsafe fn wrap_RsIOStream<'io_stream>( + stream: *mut DynIOStream<'io_stream>, ) -> UniquePtr>; #[namespace = "TagLib"] diff --git a/musikr/src/main/jni/src/taglib/iostream.rs b/musikr/src/main/jni/src/taglib/iostream.rs index 2874f6668..5422c1fa2 100644 --- a/musikr/src/main/jni/src/taglib/iostream.rs +++ b/musikr/src/main/jni/src/taglib/iostream.rs @@ -14,14 +14,20 @@ pub trait IOStream { } pub(super) struct BridgedIOStream<'io_stream> { + stream: Box>, cpp_stream: UniquePtr>, } impl<'io_stream> BridgedIOStream<'io_stream> { pub fn new(stream: T) -> Self { - let rs_stream: Box> = Box::new(DynIOStream(Box::new(stream))); - let cpp_stream: UniquePtr> = bridge::wrap_RsIOStream(rs_stream); - BridgedIOStream { cpp_stream } + let mut rs_stream: Box> = Box::new(DynIOStream(Box::new(stream))); + let cpp_stream: UniquePtr> = unsafe { + bridge::wrap_RsIOStream(rs_stream.as_mut() as *mut _) + }; + BridgedIOStream { + stream: rs_stream, + cpp_stream, + } } pub fn cpp_stream(&self) -> &UniquePtr {