From b7ba126db0d796348ba884333b341e50252433ad Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 20 May 2021 16:34:30 +0200 Subject: Android: Use JNI for getting post-processsing shaders The Java implementation of getting the list of post-processing shaders only looked in the Sys folder and not the User folder. This could be fixed in the Java implementation, but it's simpler to just call the C++ implementation instead. --- .../features/settings/model/PostProcessing.java | 15 ++ .../settings/ui/SettingsFragmentPresenter.java | 55 ++---- Source/Android/jni/AndroidCommon/AndroidCommon.cpp | 4 +- Source/Android/jni/AndroidCommon/AndroidCommon.h | 2 + Source/Android/jni/CMakeLists.txt | 3 +- Source/Android/jni/Config/NativeConfig.cpp | 211 +++++++++++++++++++++ Source/Android/jni/Config/PostProcessing.cpp | 35 ++++ Source/Android/jni/NativeConfig.cpp | 211 --------------------- 8 files changed, 278 insertions(+), 258 deletions(-) create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/PostProcessing.java create mode 100644 Source/Android/jni/Config/NativeConfig.cpp create mode 100644 Source/Android/jni/Config/PostProcessing.cpp delete mode 100644 Source/Android/jni/NativeConfig.cpp (limited to 'Source/Android') diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/PostProcessing.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/PostProcessing.java new file mode 100644 index 0000000000..4d7ccd5032 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/PostProcessing.java @@ -0,0 +1,15 @@ +package org.dolphinemu.dolphinemu.features.settings.model; + +import androidx.annotation.NonNull; + +public class PostProcessing +{ + @NonNull + public static native String[] getShaderList(); + + @NonNull + public static native String[] getAnaglyphShaderList(); + + @NonNull + public static native String[] getPassiveShaderList(); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java index f23e0cf374..75c0faaa09 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java @@ -17,6 +17,7 @@ import org.dolphinemu.dolphinemu.features.settings.model.IntSetting; import org.dolphinemu.dolphinemu.features.settings.model.LegacyBooleanSetting; import org.dolphinemu.dolphinemu.features.settings.model.LegacyIntSetting; import org.dolphinemu.dolphinemu.features.settings.model.LegacyStringSetting; +import org.dolphinemu.dolphinemu.features.settings.model.PostProcessing; import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.model.StringSetting; import org.dolphinemu.dolphinemu.features.settings.model.WiimoteProfileStringSetting; @@ -622,11 +623,17 @@ public final class SettingsFragmentPresenter int stereoModeValue = IntSetting.GFX_STEREO_MODE.getInt(mSettings); final int anaglyphMode = 3; - String subDir = stereoModeValue == anaglyphMode ? "Anaglyph" : null; - String[] shaderListEntries = getShaderList(subDir); - String[] shaderListValues = new String[shaderListEntries.length]; - System.arraycopy(shaderListEntries, 0, shaderListValues, 0, shaderListEntries.length); + String[] shaderList = stereoModeValue == anaglyphMode ? + PostProcessing.getAnaglyphShaderList() : PostProcessing.getShaderList(); + + String[] shaderListEntries = new String[shaderList.length + 1]; + shaderListEntries[0] = mContext.getString(R.string.off); + System.arraycopy(shaderList, 0, shaderListEntries, 1, shaderList.length); + + String[] shaderListValues = new String[shaderList.length + 1]; shaderListValues[0] = ""; + System.arraycopy(shaderList, 0, shaderListValues, 1, shaderList.length); + sl.add(new StringSingleChoiceSetting(mContext, StringSetting.GFX_ENHANCE_POST_SHADER, R.string.post_processing_shader, 0, shaderListEntries, shaderListValues)); @@ -664,46 +671,6 @@ public final class SettingsFragmentPresenter } } - private String[] getShaderList(String subDir) - { - try - { - String shadersPath = - DirectoryInitialization.getDolphinInternalDirectory() + "/Shaders"; - if (!TextUtils.isEmpty(subDir)) - { - shadersPath += "/" + subDir; - } - - File file = new File(shadersPath); - File[] shaderFiles = file.listFiles(); - if (shaderFiles != null) - { - String[] result = new String[shaderFiles.length + 1]; - result[0] = mView.getActivity().getString(R.string.off); - for (int i = 0; i < shaderFiles.length; i++) - { - String name = shaderFiles[i].getName(); - int extensionIndex = name.indexOf(".glsl"); - if (extensionIndex > 0) - { - name = name.substring(0, extensionIndex); - } - result[i + 1] = name; - } - - return result; - } - } - catch (Exception ex) - { - Log.debug("[Settings] Unable to find shader files"); - // return empty list - } - - return new String[]{}; - } - private void addHackSettings(ArrayList sl) { sl.add(new HeaderSetting(mContext, R.string.embedded_frame_buffer, 0)); diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp index b5a5a7faaa..06da3774c2 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.cpp +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.cpp @@ -44,7 +44,7 @@ std::vector JStringArrayToVector(JNIEnv* env, jobjectArray array) return result; } -jobjectArray JStringArrayFromVector(JNIEnv* env, std::vector vector) +jobjectArray VectorToJStringArray(JNIEnv* env, std::vector vector) { jobjectArray result = env->NewObjectArray(vector.size(), IDCache::GetStringClass(), nullptr); for (jsize i = 0; i < vector.size(); ++i) @@ -145,7 +145,7 @@ std::vector DoFileSearchAndroidContent(const std::string& directory JNIEnv* env = IDCache::GetEnvForThread(); jobject result = env->CallStaticObjectMethod( IDCache::GetContentHandlerClass(), IDCache::GetContentHandlerDoFileSearch(), - ToJString(env, directory), JStringArrayFromVector(env, extensions), recursive); + ToJString(env, directory), VectorToJStringArray(env, extensions), recursive); return JStringArrayToVector(env, reinterpret_cast(result)); } diff --git a/Source/Android/jni/AndroidCommon/AndroidCommon.h b/Source/Android/jni/AndroidCommon/AndroidCommon.h index 7d4f5d0fbc..b5b0d0eaa9 100644 --- a/Source/Android/jni/AndroidCommon/AndroidCommon.h +++ b/Source/Android/jni/AndroidCommon/AndroidCommon.h @@ -12,7 +12,9 @@ std::string GetJString(JNIEnv* env, jstring jstr); jstring ToJString(JNIEnv* env, const std::string& str); + std::vector JStringArrayToVector(JNIEnv* env, jobjectArray array); +jobjectArray VectorToJStringArray(JNIEnv* env, std::vector vector); // Returns true if the given path should be opened as Android content instead of a normal file. bool IsPathAndroidContent(const std::string& uri); diff --git a/Source/Android/jni/CMakeLists.txt b/Source/Android/jni/CMakeLists.txt index 405d621958..d358ed46d1 100644 --- a/Source/Android/jni/CMakeLists.txt +++ b/Source/Android/jni/CMakeLists.txt @@ -1,10 +1,11 @@ add_library(main SHARED + Config/NativeConfig.cpp + Config/PostProcessing.cpp GameList/GameFile.cpp GameList/GameFile.h GameList/GameFileCache.cpp IniFile.cpp MainAndroid.cpp - NativeConfig.cpp WiiUtils.cpp ) diff --git a/Source/Android/jni/Config/NativeConfig.cpp b/Source/Android/jni/Config/NativeConfig.cpp new file mode 100644 index 0000000000..31fe9ade9a --- /dev/null +++ b/Source/Android/jni/Config/NativeConfig.cpp @@ -0,0 +1,211 @@ +// Copyright 2020 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include +#include + +#include + +#include "Common/Assert.h" +#include "Common/Config/Config.h" +#include "Core/ConfigLoaders/GameConfigLoader.h" +#include "Core/ConfigLoaders/IsSettingSaveable.h" +#include "jni/AndroidCommon/AndroidCommon.h" + +constexpr jint LAYER_BASE_OR_CURRENT = 0; +constexpr jint LAYER_BASE = 1; +constexpr jint LAYER_LOCAL_GAME = 2; +constexpr jint LAYER_ACTIVE = 3; + +static Config::Location GetLocation(JNIEnv* env, jstring file, jstring section, jstring key) +{ + const std::string decoded_file = GetJString(env, file); + + Config::System system; + if (decoded_file == "Dolphin") + { + system = Config::System::Main; + } + else if (decoded_file == "SYSCONF") + { + system = Config::System::SYSCONF; + } + else if (decoded_file == "GFX") + { + system = Config::System::GFX; + } + else if (decoded_file == "Logger") + { + system = Config::System::Logger; + } + else + { + ASSERT(false); + return {}; + } + + return Config::Location{system, GetJString(env, section), GetJString(env, key)}; +} + +static std::shared_ptr GetLayer(jint layer, const Config::Location& location) +{ + Config::LayerType layer_type; + + switch (layer) + { + case LAYER_BASE_OR_CURRENT: + if (GetActiveLayerForConfig(location) == Config::LayerType::Base) + layer_type = Config::LayerType::Base; + else + layer_type = Config::LayerType::CurrentRun; + break; + + case LAYER_BASE: + layer_type = Config::LayerType::Base; + break; + + case LAYER_LOCAL_GAME: + layer_type = Config::LayerType::LocalGame; + break; + + case LAYER_ACTIVE: + layer_type = Config::GetActiveLayerForConfig(location); + break; + + default: + ASSERT(false); + return nullptr; + } + + return Config::GetLayer(layer_type); +} + +template +static T Get(jint layer, const Config::Location& location, T default_value) +{ + return GetLayer(layer, location)->Get(location).value_or(default_value); +} + +template +static void Set(jint layer, const Config::Location& location, T value) +{ + GetLayer(layer, location)->Set(location, value); + Config::OnConfigChanged(); +} + +extern "C" { + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isSettingSaveable( + JNIEnv* env, jclass, jstring file, jstring section, jstring key) +{ + const Config::Location location = GetLocation(env, file, section, key); + return static_cast(ConfigLoaders::IsSettingSaveable(location)); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_loadGameInis(JNIEnv* env, + jclass, + jstring jGameId, + jint jRevision) +{ + const std::string game_id = GetJString(env, jGameId); + const u16 revision = static_cast(jRevision); + Config::AddLayer(ConfigLoaders::GenerateGlobalGameConfigLoader(game_id, revision)); + Config::AddLayer(ConfigLoaders::GenerateLocalGameConfigLoader(game_id, revision)); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_unloadGameInis(JNIEnv*, jclass) +{ + Config::RemoveLayer(Config::LayerType::GlobalGame); + Config::RemoveLayer(Config::LayerType::LocalGame); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_save( + JNIEnv*, jclass, jint layer) +{ + const std::shared_ptr layer_ptr = GetLayer(layer, {}); + + // Workaround for the Settings class carrying around a legacy map of settings it always saves + layer_ptr->MarkAsDirty(); + + return layer_ptr->Save(); +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isOverridden( + JNIEnv* env, jclass, jstring file, jstring section, jstring key) +{ + const Config::Location location = GetLocation(env, file, section, key); + const bool result = Config::GetActiveLayerForConfig(location) != Config::LayerType::Base; + return static_cast(result); +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_deleteKey( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key) +{ + const Config::Location location = GetLocation(env, file, section, key); + return static_cast(GetLayer(layer, location)->DeleteKey(location)); +} + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getString( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, + jstring default_value) +{ + const Config::Location location = GetLocation(env, file, section, key); + return ToJString(env, Get(layer, location, GetJString(env, default_value))); +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getBoolean( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, + jboolean default_value) +{ + const Config::Location location = GetLocation(env, file, section, key); + return static_cast(Get(layer, location, static_cast(default_value))); +} + +JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getInt( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jint default_value) +{ + return Get(layer, GetLocation(env, file, section, key), default_value); +} + +JNIEXPORT jfloat JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getFloat( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, + jfloat default_value) +{ + return Get(layer, GetLocation(env, file, section, key), default_value); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setString( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jstring value) +{ + return Set(layer, GetLocation(env, file, section, key), GetJString(env, value)); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setBoolean( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jboolean value) +{ + return Set(layer, GetLocation(env, file, section, key), static_cast(value)); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setInt( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jint value) +{ + return Set(layer, GetLocation(env, file, section, key), value); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setFloat( + JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jfloat value) +{ + return Set(layer, GetLocation(env, file, section, key), value); +} +} diff --git a/Source/Android/jni/Config/PostProcessing.cpp b/Source/Android/jni/Config/PostProcessing.cpp new file mode 100644 index 0000000000..a96afca1a7 --- /dev/null +++ b/Source/Android/jni/Config/PostProcessing.cpp @@ -0,0 +1,35 @@ +// Copyright 2021 Dolphin Emulator Project +// Licensed under GPLv2+ +// Refer to the license.txt file included. + +#include +#include + +#include + +#include "VideoCommon/PostProcessing.cpp" +#include "jni/AndroidCommon/AndroidCommon.h" + +extern "C" { + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_PostProcessing_getShaderList(JNIEnv* env, + jclass) +{ + return VectorToJStringArray(env, VideoCommon::PostProcessing::GetShaderList()); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_PostProcessing_getAnaglyphShaderList( + JNIEnv* env, jclass) +{ + return VectorToJStringArray(env, VideoCommon::PostProcessing::GetAnaglyphShaderList()); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_settings_model_PostProcessing_getPassiveShaderList( + JNIEnv* env, jclass) +{ + return VectorToJStringArray(env, VideoCommon::PostProcessing::GetPassiveShaderList()); +} +} diff --git a/Source/Android/jni/NativeConfig.cpp b/Source/Android/jni/NativeConfig.cpp deleted file mode 100644 index 31fe9ade9a..0000000000 --- a/Source/Android/jni/NativeConfig.cpp +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2020 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#include -#include - -#include - -#include "Common/Assert.h" -#include "Common/Config/Config.h" -#include "Core/ConfigLoaders/GameConfigLoader.h" -#include "Core/ConfigLoaders/IsSettingSaveable.h" -#include "jni/AndroidCommon/AndroidCommon.h" - -constexpr jint LAYER_BASE_OR_CURRENT = 0; -constexpr jint LAYER_BASE = 1; -constexpr jint LAYER_LOCAL_GAME = 2; -constexpr jint LAYER_ACTIVE = 3; - -static Config::Location GetLocation(JNIEnv* env, jstring file, jstring section, jstring key) -{ - const std::string decoded_file = GetJString(env, file); - - Config::System system; - if (decoded_file == "Dolphin") - { - system = Config::System::Main; - } - else if (decoded_file == "SYSCONF") - { - system = Config::System::SYSCONF; - } - else if (decoded_file == "GFX") - { - system = Config::System::GFX; - } - else if (decoded_file == "Logger") - { - system = Config::System::Logger; - } - else - { - ASSERT(false); - return {}; - } - - return Config::Location{system, GetJString(env, section), GetJString(env, key)}; -} - -static std::shared_ptr GetLayer(jint layer, const Config::Location& location) -{ - Config::LayerType layer_type; - - switch (layer) - { - case LAYER_BASE_OR_CURRENT: - if (GetActiveLayerForConfig(location) == Config::LayerType::Base) - layer_type = Config::LayerType::Base; - else - layer_type = Config::LayerType::CurrentRun; - break; - - case LAYER_BASE: - layer_type = Config::LayerType::Base; - break; - - case LAYER_LOCAL_GAME: - layer_type = Config::LayerType::LocalGame; - break; - - case LAYER_ACTIVE: - layer_type = Config::GetActiveLayerForConfig(location); - break; - - default: - ASSERT(false); - return nullptr; - } - - return Config::GetLayer(layer_type); -} - -template -static T Get(jint layer, const Config::Location& location, T default_value) -{ - return GetLayer(layer, location)->Get(location).value_or(default_value); -} - -template -static void Set(jint layer, const Config::Location& location, T value) -{ - GetLayer(layer, location)->Set(location, value); - Config::OnConfigChanged(); -} - -extern "C" { - -JNIEXPORT jboolean JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isSettingSaveable( - JNIEnv* env, jclass, jstring file, jstring section, jstring key) -{ - const Config::Location location = GetLocation(env, file, section, key); - return static_cast(ConfigLoaders::IsSettingSaveable(location)); -} - -JNIEXPORT void JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_loadGameInis(JNIEnv* env, - jclass, - jstring jGameId, - jint jRevision) -{ - const std::string game_id = GetJString(env, jGameId); - const u16 revision = static_cast(jRevision); - Config::AddLayer(ConfigLoaders::GenerateGlobalGameConfigLoader(game_id, revision)); - Config::AddLayer(ConfigLoaders::GenerateLocalGameConfigLoader(game_id, revision)); -} - -JNIEXPORT void JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_unloadGameInis(JNIEnv*, jclass) -{ - Config::RemoveLayer(Config::LayerType::GlobalGame); - Config::RemoveLayer(Config::LayerType::LocalGame); -} - -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_save( - JNIEnv*, jclass, jint layer) -{ - const std::shared_ptr layer_ptr = GetLayer(layer, {}); - - // Workaround for the Settings class carrying around a legacy map of settings it always saves - layer_ptr->MarkAsDirty(); - - return layer_ptr->Save(); -} - -JNIEXPORT jboolean JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_isOverridden( - JNIEnv* env, jclass, jstring file, jstring section, jstring key) -{ - const Config::Location location = GetLocation(env, file, section, key); - const bool result = Config::GetActiveLayerForConfig(location) != Config::LayerType::Base; - return static_cast(result); -} - -JNIEXPORT jboolean JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_deleteKey( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key) -{ - const Config::Location location = GetLocation(env, file, section, key); - return static_cast(GetLayer(layer, location)->DeleteKey(location)); -} - -JNIEXPORT jstring JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getString( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, - jstring default_value) -{ - const Config::Location location = GetLocation(env, file, section, key); - return ToJString(env, Get(layer, location, GetJString(env, default_value))); -} - -JNIEXPORT jboolean JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getBoolean( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, - jboolean default_value) -{ - const Config::Location location = GetLocation(env, file, section, key); - return static_cast(Get(layer, location, static_cast(default_value))); -} - -JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getInt( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jint default_value) -{ - return Get(layer, GetLocation(env, file, section, key), default_value); -} - -JNIEXPORT jfloat JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_getFloat( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, - jfloat default_value) -{ - return Get(layer, GetLocation(env, file, section, key), default_value); -} - -JNIEXPORT void JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setString( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jstring value) -{ - return Set(layer, GetLocation(env, file, section, key), GetJString(env, value)); -} - -JNIEXPORT void JNICALL -Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setBoolean( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jboolean value) -{ - return Set(layer, GetLocation(env, file, section, key), static_cast(value)); -} - -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setInt( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jint value) -{ - return Set(layer, GetLocation(env, file, section, key), value); -} - -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_features_settings_model_NativeConfig_setFloat( - JNIEnv* env, jclass, jint layer, jstring file, jstring section, jstring key, jfloat value) -{ - return Set(layer, GetLocation(env, file, section, key), value); -} -} -- cgit v1.2.3