2 * Copyright (C) 2018 Christian Browet
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "JNIXBMCFile.h"
11 #include "CompileInfo.h"
12 #include "utils/FileUtils.h"
13 #include "utils/log.h"
17 #include <androidjni/jutils-details.hpp>
23 static std::string s_className
= std::string(CCompileInfo::GetClass()) + "/XBMCFile";
25 CJNIXBMCFile::CJNIXBMCFile()
30 void CJNIXBMCFile::RegisterNatives(JNIEnv
*env
)
32 jclass cClass
= env
->FindClass(s_className
.c_str());
35 JNINativeMethod methods
[] =
37 {"_open", "(Ljava/lang/String;)Z", (void*)&CJNIXBMCFile::_open
},
38 {"_close", "()V", (void*)&CJNIXBMCFile::_close
},
39 {"_read", "()[B", (void*)&CJNIXBMCFile::_read
},
40 {"_eof", "()Z", (void*)&CJNIXBMCFile::_eof
},
43 env
->RegisterNatives(cClass
, methods
, sizeof(methods
)/sizeof(methods
[0]));
47 jboolean
CJNIXBMCFile::_open(JNIEnv
*env
, jobject thiz
, jstring path
)
49 std::string strPath
= jcast
<std::string
>(jhstring::fromJNI(path
));
51 if (find_instance(thiz
))
54 if (!XFILE::CFile::Exists(strPath
))
57 CJNIXBMCFile
* file
= new CJNIXBMCFile();
58 file
->m_file
= std::make_unique
<XFILE::CFile
>();
59 bool ret
= file
->m_file
->Open(strPath
);
66 jhobject jo
= jhobject::fromJNI(thiz
);
68 add_instance(jo
, file
);
73 void CJNIXBMCFile::_close(JNIEnv
*env
, jobject thiz
)
75 CJNIXBMCFile
*inst
= find_instance(thiz
);
78 inst
->m_file
->Close();
79 remove_instance(inst
);
84 jbyteArray
CJNIXBMCFile::_read(JNIEnv
*env
, jobject thiz
)
87 char buffer
[BUFFSIZE
];
89 CJNIXBMCFile
*inst
= find_instance(thiz
);
90 if (inst
&& inst
->m_file
)
92 sz
= inst
->m_file
->Read((void*)buffer
, BUFFSIZE
);
100 jbyteArray jba
= NULL
;
102 jba
= env
->NewByteArray(sz
);
103 if ((pArray
= (char*)env
->GetPrimitiveArrayCritical(jba
, NULL
)))
105 memcpy(pArray
, buffer
, sz
);
106 env
->ReleasePrimitiveArrayCritical(jba
, pArray
, 0);
112 jboolean
CJNIXBMCFile::_eof(JNIEnv
*env
, jobject thiz
)
114 CJNIXBMCFile
*inst
= find_instance(thiz
);