mirror of
https://github.com/overte-org/overte.git
synced 2025-04-14 07:47:30 +02:00
Fix unpack resources on android
This commit is contained in:
parent
b1e95681a9
commit
10a67fd9f8
1 changed files with 67 additions and 29 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
|
||||||
|
#include <QtCore/QBuffer>
|
||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
#include <QtCore/QDir>
|
#include <QtCore/QDir>
|
||||||
#include <QtCore/QFile>
|
#include <QtCore/QFile>
|
||||||
|
@ -12,6 +16,8 @@
|
||||||
#include <android/asset_manager.h>
|
#include <android/asset_manager.h>
|
||||||
#include <android/asset_manager_jni.h>
|
#include <android/asset_manager_jni.h>
|
||||||
|
|
||||||
|
#include <shared/Storage.h>
|
||||||
|
|
||||||
void tempMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) {
|
void tempMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) {
|
||||||
if (!message.isEmpty()) {
|
if (!message.isEmpty()) {
|
||||||
const char * local=message.toStdString().c_str();
|
const char * local=message.toStdString().c_str();
|
||||||
|
@ -36,33 +42,65 @@ void tempMessageHandler(QtMsgType type, const QMessageLogContext& context, const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void unpackAndroidAssets() {
|
AAssetManager* g_assetManager = nullptr;
|
||||||
const QString SOURCE_PREFIX { "assets:/" };
|
|
||||||
const QString DEST_PREFIX = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/";
|
|
||||||
QStringList filesToCopy;
|
|
||||||
QString dateStamp;
|
|
||||||
{
|
|
||||||
QFile file("assets:/cache_assets.txt");
|
|
||||||
if (!file.open(QIODevice::ReadOnly)) {
|
|
||||||
throw std::runtime_error("Failed to open cache file list");
|
|
||||||
}
|
|
||||||
QTextStream in(&file);
|
|
||||||
dateStamp = DEST_PREFIX + "/" + in.readLine();
|
|
||||||
while (!in.atEnd()) {
|
|
||||||
QString line = in.readLine();
|
|
||||||
filesToCopy << line;
|
|
||||||
}
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
qDebug() << "Checking date stamp" << dateStamp;
|
|
||||||
|
|
||||||
if (QFileInfo(dateStamp).exists()) {
|
void withAssetData(const char* filename, const std::function<void(off64_t, const void*)>& callback) {
|
||||||
|
auto asset = AAssetManager_open(g_assetManager, filename, AASSET_MODE_BUFFER);
|
||||||
|
if (!asset) {
|
||||||
|
throw std::runtime_error("Failed to open file");
|
||||||
|
}
|
||||||
|
auto buffer = AAsset_getBuffer(asset);
|
||||||
|
off64_t size = AAsset_getLength64(asset);
|
||||||
|
callback(size, buffer);
|
||||||
|
AAsset_close(asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList readAssetLines(const char* filename) {
|
||||||
|
QStringList result;
|
||||||
|
withAssetData(filename, [&](off64_t size, const void* data){
|
||||||
|
QByteArray buffer = QByteArray::fromRawData((const char*)data, size);
|
||||||
|
{
|
||||||
|
QTextStream in(&buffer);
|
||||||
|
while (!in.atEnd()) {
|
||||||
|
QString line = in.readLine();
|
||||||
|
result << line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void copyAsset(const char* sourceAsset, const QString& destFilename) {
|
||||||
|
withAssetData(sourceAsset, [&](off64_t size, const void* data){
|
||||||
|
QFile file(destFilename);
|
||||||
|
if (!file.open(QFile::ReadWrite | QIODevice::Truncate)) {
|
||||||
|
throw std::runtime_error("Unable to open output file for writing");
|
||||||
|
}
|
||||||
|
if (!file.resize(size)) {
|
||||||
|
throw std::runtime_error("Unable to resize output file");
|
||||||
|
}
|
||||||
|
auto mapped = file.map(0, size);
|
||||||
|
if (!mapped) {
|
||||||
|
throw std::runtime_error("Unable to map output file");
|
||||||
|
}
|
||||||
|
memcpy(mapped, data, size);
|
||||||
|
file.close();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void unpackAndroidAssets() {
|
||||||
|
const QString DEST_PREFIX = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/";
|
||||||
|
|
||||||
|
QStringList filesToCopy = readAssetLines("cache_assets.txt");
|
||||||
|
QString dateStamp = filesToCopy.takeFirst();
|
||||||
|
QString dateStampFilename = DEST_PREFIX + dateStamp;
|
||||||
|
qDebug() << "Checking date stamp" << dateStamp;
|
||||||
|
if (QFileInfo(dateStampFilename).exists()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto rootDir = QDir::root();
|
auto rootDir = QDir::root();
|
||||||
for (const auto& fileToCopy : filesToCopy) {
|
for (const auto& fileToCopy : filesToCopy) {
|
||||||
auto sourceFileName = SOURCE_PREFIX + fileToCopy;
|
|
||||||
auto destFileName = DEST_PREFIX + fileToCopy;
|
auto destFileName = DEST_PREFIX + fileToCopy;
|
||||||
auto destFolder = QFileInfo(destFileName).absoluteDir();
|
auto destFolder = QFileInfo(destFileName).absoluteDir();
|
||||||
if (!destFolder.exists()) {
|
if (!destFolder.exists()) {
|
||||||
|
@ -78,19 +116,18 @@ void unpackAndroidAssets() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "Copying from" << sourceFileName << "to" << destFileName;
|
qDebug() << "Copying asset " << fileToCopy << "to" << destFileName;
|
||||||
if (!QFile(sourceFileName).copy(destFileName)) {
|
copyAsset(fileToCopy.toStdString().c_str(), destFileName);
|
||||||
throw std::runtime_error("Failed to unpack cache files");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
qDebug() << "Writing date stamp" << dateStamp;
|
qDebug() << "Writing date stamp" << dateStamp;
|
||||||
QFile file(dateStamp);
|
QFile file(dateStampFilename);
|
||||||
if (file.open(QIODevice::ReadWrite)) {
|
if (!file.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
|
||||||
QTextStream(&file) << "touch" << endl;
|
throw std::runtime_error("Can't write date stamp");
|
||||||
file.close();
|
|
||||||
}
|
}
|
||||||
|
QTextStream(&file) << "touch" << endl;
|
||||||
|
file.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,6 +135,7 @@ extern "C" {
|
||||||
|
|
||||||
JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCreate(JNIEnv* env, jobject obj, jobject instance, jobject asset_mgr) {
|
JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnCreate(JNIEnv* env, jobject obj, jobject instance, jobject asset_mgr) {
|
||||||
qDebug() << "nativeOnCreate On thread " << QThread::currentThreadId();
|
qDebug() << "nativeOnCreate On thread " << QThread::currentThreadId();
|
||||||
|
g_assetManager = AAssetManager_fromJava(env, asset_mgr);
|
||||||
auto oldMessageHandler = qInstallMessageHandler(tempMessageHandler);
|
auto oldMessageHandler = qInstallMessageHandler(tempMessageHandler);
|
||||||
unpackAndroidAssets();
|
unpackAndroidAssets();
|
||||||
qInstallMessageHandler(oldMessageHandler);
|
qInstallMessageHandler(oldMessageHandler);
|
||||||
|
|
Loading…
Reference in a new issue