diff --git a/musikr/src/main/cpp/JInputStream.cpp b/musikr/src/main/cpp/JInputStream.cpp index cde598ce9..3c3ecea87 100644 --- a/musikr/src/main/cpp/JInputStream.cpp +++ b/musikr/src/main/cpp/JInputStream.cpp @@ -31,7 +31,7 @@ JInputStream::JInputStream(JNIEnv *env, jobject jInputStream) : env(env), jInput if (!env->IsInstanceOf(jInputStream, *jInputStreamClass)) { throw std::runtime_error("Object is not NativeInputStream"); } - jInputStreamNameMethod = jInputStreamClass.method("name", + jmethodID jInputStreamNameMethod = jInputStreamClass.method("name", "()Ljava/lang/String;"); jInputStreamReadBlockMethod = jInputStreamClass.method("readBlock", "(Ljava/nio/ByteBuffer;)Z"); @@ -44,6 +44,9 @@ JInputStream::JInputStream(JNIEnv *env, jobject jInputStream) : env(env), jInput "(J)Z"); jInputStreamTellMethod = jInputStreamClass.method("tell", "()J"); jInputStreamLengthMethod = jInputStreamClass.method("length", "()J"); + JStringRef jName = { env, reinterpret_cast(env->CallObjectMethod( + jInputStream, jInputStreamNameMethod)) }; + _name = TagLib::String(env->GetStringUTFChars(*jName, nullptr)); } JInputStream::~JInputStream() { @@ -51,11 +54,8 @@ JInputStream::~JInputStream() { // so we don't need to delete any references here } -TagLib::FileName JInputStream::name() const { - // Not actually used except in FileRef, can safely ignore. - JStringRef jName { env, reinterpret_cast(env->CallObjectMethod( - jInputStream, jInputStreamNameMethod)) }; - return jName.copy().toCString(); +TagLib::FileName /* const char * */ JInputStream::name() const { + return _name.toCString(true); } TagLib::ByteVector JInputStream::readBlock(size_t length) { diff --git a/musikr/src/main/cpp/JInputStream.h b/musikr/src/main/cpp/JInputStream.h index ce3399d4d..8b31f47fa 100644 --- a/musikr/src/main/cpp/JInputStream.h +++ b/musikr/src/main/cpp/JInputStream.h @@ -23,6 +23,7 @@ #include "JObjectRef.h" #include "taglib/tiostream.h" +#include "taglib/tstring.h" class JInputStream: public TagLib::IOStream { public: @@ -36,7 +37,7 @@ public: /*! * Returns the stream name in the local file system encoding. */ - TagLib::FileName name() const override; + TagLib::FileName /* const char * */ name() const override; /*! * Reads a block of size \a length at the current get pointer. @@ -115,7 +116,7 @@ public: private: JNIEnv *env; jobject jInputStream; - jmethodID jInputStreamNameMethod; + TagLib::String _name; jmethodID jInputStreamReadBlockMethod; jmethodID jInputStreamIsOpenMethod; jmethodID jInputStreamSeekFromBeginningMethod;