Pass native library dir to OS + reorder OS init order so paths are first

This is required for integrating libadrenotools, which needs access to
library and app directories in the GPU class constructor.
This commit is contained in:
Billy Laws 2021-12-08 22:08:55 +00:00 committed by PixelyIon
parent 900d00a876
commit dd91d063a5
4 changed files with 13 additions and 4 deletions

View File

@ -74,6 +74,7 @@ extern "C" JNIEXPORT void Java_emu_skyline_EmulationActivity_executeApplication(
jint preferenceFd, jint preferenceFd,
jint systemLanguage, jint systemLanguage,
jstring appFilesPathJstring, jstring appFilesPathJstring,
jstring nativeLibraryPathJstring,
jobject assetManager jobject assetManager
) { ) {
skyline::signal::ScopedStackBlocker stackBlocker; // We do not want anything to unwind past JNI code as there are invalid stack frames which can lead to a segmentation fault skyline::signal::ScopedStackBlocker stackBlocker; // We do not want anything to unwind past JNI code as there are invalid stack frames which can lead to a segmentation fault
@ -98,10 +99,13 @@ extern "C" JNIEXPORT void Java_emu_skyline_EmulationActivity_executeApplication(
perfetto::TrackEvent::Register(); perfetto::TrackEvent::Register();
try { try {
skyline::JniString nativeLibraryPath(env, nativeLibraryPathJstring);
auto os{std::make_shared<skyline::kernel::OS>( auto os{std::make_shared<skyline::kernel::OS>(
jvmManager, jvmManager,
settings, settings,
appFilesPath, appFilesPath,
nativeLibraryPath,
GetTimeZoneName(), GetTimeZoneName(),
static_cast<skyline::language::SystemLanguage>(systemLanguage), static_cast<skyline::language::SystemLanguage>(systemLanguage),
std::make_shared<skyline::vfs::AndroidAssetFileSystem>(AAssetManager_fromJava(env, assetManager)) std::make_shared<skyline::vfs::AndroidAssetFileSystem>(AAssetManager_fromJava(env, assetManager))

View File

@ -17,11 +17,13 @@ namespace skyline::kernel {
std::shared_ptr<JvmManager> &jvmManager, std::shared_ptr<JvmManager> &jvmManager,
std::shared_ptr<Settings> &settings, std::shared_ptr<Settings> &settings,
std::string appFilesPath, std::string appFilesPath,
std::string nativeLibraryPath,
std::string deviceTimeZone, std::string deviceTimeZone,
language::SystemLanguage systemLanguage, language::SystemLanguage systemLanguage,
std::shared_ptr<vfs::FileSystem> assetFileSystem) std::shared_ptr<vfs::FileSystem> assetFileSystem)
: state(this, jvmManager, settings), : nativeLibraryPath(std::move(nativeLibraryPath)),
appFilesPath(std::move(appFilesPath)), appFilesPath(std::move(appFilesPath)),
state(this, jvmManager, settings),
deviceTimeZone(std::move(deviceTimeZone)), deviceTimeZone(std::move(deviceTimeZone)),
assetFileSystem(std::move(assetFileSystem)), assetFileSystem(std::move(assetFileSystem)),
serviceManager(state), serviceManager(state),

View File

@ -14,8 +14,9 @@ namespace skyline::kernel {
*/ */
class OS { class OS {
public: public:
DeviceState state; std::string nativeLibraryPath; //!< The full path to the app's native library directory
std::string appFilesPath; //!< The full path to the app's files directory std::string appFilesPath; //!< The full path to the app's files directory
DeviceState state;
std::string deviceTimeZone; //!< The timezone name (e.g. Europe/London) std::string deviceTimeZone; //!< The timezone name (e.g. Europe/London)
std::shared_ptr<vfs::FileSystem> assetFileSystem; //!< A filesystem to be used for accessing emulator assets (like tzdata) std::shared_ptr<vfs::FileSystem> assetFileSystem; //!< A filesystem to be used for accessing emulator assets (like tzdata)
service::ServiceManager serviceManager; service::ServiceManager serviceManager;
@ -30,6 +31,7 @@ namespace skyline::kernel {
std::shared_ptr<Settings> &settings, std::shared_ptr<Settings> &settings,
std::string appFilesPath, std::string appFilesPath,
std::string deviceTimeZone, std::string deviceTimeZone,
std::string nativeLibraryPath,
language::SystemLanguage systemLanguage, language::SystemLanguage systemLanguage,
std::shared_ptr<vfs::FileSystem> assetFileSystem std::shared_ptr<vfs::FileSystem> assetFileSystem
); );

View File

@ -70,9 +70,10 @@ class EmulationActivity : AppCompatActivity(), SurfaceHolder.Callback, View.OnTo
* @param romFd The file descriptor of the ROM object * @param romFd The file descriptor of the ROM object
* @param preferenceFd The file descriptor of the Preference XML * @param preferenceFd The file descriptor of the Preference XML
* @param appFilesPath The full path to the app files directory * @param appFilesPath The full path to the app files directory
* @param nativeLibraryPath The full path to the app native library directory
* @param assetManager The asset manager used for accessing app assets * @param assetManager The asset manager used for accessing app assets
*/ */
private external fun executeApplication(romUri : String, romType : Int, romFd : Int, preferenceFd : Int, language : Int, appFilesPath : String, assetManager : AssetManager) private external fun executeApplication(romUri : String, romType : Int, romFd : Int, preferenceFd : Int, language : Int, appFilesPath : String, nativeLibraryPath : String, assetManager : AssetManager)
/** /**
* @param join If the function should only return after all the threads join or immediately * @param join If the function should only return after all the threads join or immediately
@ -211,7 +212,7 @@ class EmulationActivity : AppCompatActivity(), SurfaceHolder.Callback, View.OnTo
val preferenceFd = ParcelFileDescriptor.open(File("${applicationInfo.dataDir}/shared_prefs/${applicationInfo.packageName}_preferences.xml"), ParcelFileDescriptor.MODE_READ_WRITE) val preferenceFd = ParcelFileDescriptor.open(File("${applicationInfo.dataDir}/shared_prefs/${applicationInfo.packageName}_preferences.xml"), ParcelFileDescriptor.MODE_READ_WRITE)
emulationThread = Thread { emulationThread = Thread {
executeApplication(rom.toString(), romType, romFd.detachFd(), preferenceFd.detachFd(), settings.systemLanguage, applicationContext.filesDir.canonicalPath + "/", assets) executeApplication(rom.toString(), romType, romFd.detachFd(), preferenceFd.detachFd(), settings.systemLanguage, applicationContext.filesDir.canonicalPath + "/", applicationInfo.nativeLibraryDir + "/", assets)
returnFromEmulation() returnFromEmulation()
} }