From 214785f13a2e5308b142548fabe3541699974944 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hauke=20Kr=C3=BCger?= Date: Fri, 31 May 2024 09:40:27 +0200 Subject: [PATCH] Started to add template files for Linux build --- .../linux/ayfcorepack/CMakeLists.txt | 122 ++++++++++++++++++ .../linux/ayfcorepack/ayfcorepack_plugin.cc | 98 ++++++++++++++ .../include/ayfcorepack/ayfcorepack_plugin.h | 26 ++++ .../linux/common/ayf-sdk-local-headers.h | 10 ++ .../example/lib/models/ayf_ui_specific.dart | 2 +- 5 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 flutter/project_templates/linux/ayfcorepack/CMakeLists.txt create mode 100644 flutter/project_templates/linux/ayfcorepack/ayfcorepack_plugin.cc create mode 100644 flutter/project_templates/linux/ayfcorepack/include/ayfcorepack/ayfcorepack_plugin.h create mode 100644 flutter/project_templates/linux/common/ayf-sdk-local-headers.h diff --git a/flutter/project_templates/linux/ayfcorepack/CMakeLists.txt b/flutter/project_templates/linux/ayfcorepack/CMakeLists.txt new file mode 100644 index 00000000..ff53ae1f --- /dev/null +++ b/flutter/project_templates/linux/ayfcorepack/CMakeLists.txt @@ -0,0 +1,122 @@ +# The Flutter tooling requires that developers have CMake 3.10 or later +# installed. You should not increase this version, as doing so will cause +# the plugin to fail to compile for some customers of the plugin. +cmake_minimum_required(VERSION 3.10) + +# Project-level configuration. +set(PROJECT_NAME "ayfcorepack") +project(${PROJECT_NAME} LANGUAGES CXX) + +set(AYF_PROJECT ayfbinrender-native-config) +set(AYF_VERBOSE_INFO TRUE) +set(AYF_CORE_PACK_LIB lib${AYF_PROJECT}_import.so) +set(AYF_CORE_PACK_INCLUDE ${AYF_PROJECT}) + +# This value is used when generating builds using this plugin, so it must +# not be changed. +set(PLUGIN_NAME "ayfcorepack_plugin") + +# ======================================================= +# Link to ayf sdk +# ======================================================= +if(AYF_VERBOSE_INFO) + message("Module <${PROJECT_NAME}> in folder ${CMAKE_CURRENT_SOURCE_DIR}") +endif() + +if(NOT DEFINED ENV{AYF_SDK_PATH}) + message(FATAL_ERROR "Environment variable AYF_SDK_PATH not set.") +endif() +set(AYF_SDK_PATH $ENV{AYF_SDK_PATH}) + +cmake_path(CONVERT ${AYF_SDK_PATH} TO_CMAKE_PATH_LIST AYF_SDK_PATH) +if(NOT EXISTS ${AYF_SDK_PATH}) + message(FATAL_ERROR "SDK folder ${AYF_SDK_PATH} does not exist!!") +else() + if(AYF_VERBOSE_INFO) + message("----> Linking with SDK folder ${AYF_SDK_PATH}!!") + endif() +endif() + +list(APPEND PLUGIN_SOURCES + "ayfcorepack_plugin.cc" + "include/ayfcorepack/ayfcorepack_plugin.h" + "../common/ayf-sdk-local-headers.h" + "${AYF_SDK_PATH}/software/codeFragments/jvxApplications/native-config/exports/windows/exports-flutter-native-config.def" + "${AYF_SDK_PATH}/include/${AYF_CORE_PACK_INCLUDE}/include/${AYF_PROJECT}.h" +) + +# Define the plugin library target. Its name must not be changed (see comment +# on PLUGIN_NAME above). +# +# Any new source files that you add to the plugin should be added here. +add_library(${PLUGIN_NAME} SHARED + ${PLUGIN_SOURCES} +) + +# Apply a standard set of build settings that are configured in the +# application-level CMakeLists.txt. This can be removed for plugins that want +# full control over build settings. +apply_standard_settings(${PLUGIN_NAME}) + +# Symbols are hidden by default to reduce the chance of accidental conflicts +# between plugins. This should not be removed; any symbols that should be +# exported should be explicitly exported with the FLUTTER_PLUGIN_EXPORT macro. +set_target_properties(${PLUGIN_NAME} PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL) + +# Source include directories and library dependencies. Add any plugin-specific +# dependencies here. +target_include_directories(${PLUGIN_NAME} INTERFACE + "${CMAKE_CURRENT_SOURCE_DIR}/include") +target_link_libraries(${PLUGIN_NAME} PRIVATE flutter) +target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK) + +include(${AYF_SDK_PATH}/cmake/cmake-sdk/cmake-ayf-minimal-header-includes.cmake) +get_property(AYF_MINIMAL_SDK_HEADER_INCLUDES GLOBAL PROPERTY AYF_MINIMAL_SDK_HEADER_INCLUDES) +if(AYF_VERBOSE_INFO) + message("----> Found the following headers for linking libraries in the SDK: AYF_MINIMAL_SDK_HEADER_INCLUDES = ${AYF_MINIMAL_SDK_HEADER_INCLUDES}") +endif() + +target_include_directories(${PLUGIN_NAME} PRIVATE + ${AYF_MINIMAL_SDK_HEADER_INCLUDES} + ${AYF_SDK_PATH}/include/${AYF_CORE_PACK_INCLUDE}/include + ../common +) + +target_link_directories(${PLUGIN_NAME} PRIVATE + "${AYF_SDK_PATH}/lib" + "${AYF_SDK_PATH}/bin" + "${AYF_SDK_PATH}/lib/jvxComponents-static" +) + +target_link_libraries(${PLUGIN_NAME} PRIVATE + + # This is the minimum package libs aggregation: + ${AYF_CORE_PACK_LIB} + jvx-system-base_static + ) + +target_compile_features(${PLUGIN_NAME} PRIVATE cxx_std_17) + +target_compile_options(${PLUGIN_NAME} PRIVATE "-Wno-error") +target_compile_options(${PLUGIN_NAME} PRIVATE "-Wno-unused-variable") +target_compile_options(${PLUGIN_NAME} PRIVATE "-Wno-unused-function") +target_compile_definitions(${PLUGIN_NAME} PRIVATE "AYF_PROJECT=${AYF_PROJECT}") + +set(AYF_COPY_DLLS + "${AYF_SDK_PATH}/bin/${AYF_CORE_PACK_LIB}" + ) +if(AYF_VERBOSE_INFO) + message("----> Copying dlls ${AYF_COPY_DLLS}") +endif() + + +# List of absolute paths to libraries that should be bundled with the plugin. +# This list could contain prebuilt libraries, or libraries created by an +# external build triggered from this build file. +set(ayfcorepack_bundled_libraries + "" + ${AYF_COPY_DLLS} + PARENT_SCOPE +) diff --git a/flutter/project_templates/linux/ayfcorepack/ayfcorepack_plugin.cc b/flutter/project_templates/linux/ayfcorepack/ayfcorepack_plugin.cc new file mode 100644 index 00000000..19403bfc --- /dev/null +++ b/flutter/project_templates/linux/ayfcorepack/ayfcorepack_plugin.cc @@ -0,0 +1,98 @@ +#include "include/ayfcorepack/ayfcorepack_plugin.h" + +#include +#include +#include + +#include + +#include +#include "../common/ayf-sdk-local-headers.h" +#include "jvx_platform.h" + +#define AYFCOREPACK_PLUGIN(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), ayfcorepack_plugin_get_type(), \ + AyfcorepackPlugin)) + +struct _AyfcorepackPlugin { + GObject parent_instance; +}; + +G_DEFINE_TYPE(AyfcorepackPlugin, ayfcorepack_plugin, g_object_get_type()) + +// Called when a method call is received from Flutter. +static void ayfcorepack_plugin_handle_method_call( + AyfcorepackPlugin* self, + FlMethodCall* method_call) { + g_autoptr(FlMethodResponse) response = nullptr; + + const gchar* method = fl_method_call_get_name(method_call); + + if (strcmp(method, "getPlatformVersion") == 0) { + struct utsname uname_data = {}; + uname(&uname_data); + g_autofree gchar *version = g_strdup_printf("Linux %s", uname_data.version); + g_autoptr(FlValue) result = fl_value_new_string(version); + response = FL_METHOD_RESPONSE(fl_method_success_response_new(result)); + } + else if (strcmp(method, "getEntryPoints") == 0) + { + // https://levelup.gitconnected.com/writing-plugins-for-linux-in-flutter-38e46bd7872f + // https://api.flutter.dev/linux-embedder/fl__value_8h.html + + g_autoptr(FlValue) mapReturn = fl_value_new_map(); + //flutter::EncodableMap retMap; + + std::string externalAccessModuleName = JVX_GET_CURRENT_MODULE_PATH((void*)flutter_config_open); + fl_value_set(mapReturn, fl_value_new_string("loadedModule"), + fl_value_new_string(externalAccessModuleName.c_str())); + //ayfcorepack::AyfcorepackPlugin::fileNameModule.c_str())); + // retMap[flutter::EncodableValue("loadedModule")] = flutter::EncodableValue(ayfcorepack::AyfcorepackPlugin::fileNameModule); + + fl_value_set(mapReturn, fl_value_new_string("moduleEntryAddress"), fl_value_new_int((intptr_t)flutter_config_open)); + //retMap[flutter::EncodableValue("moduleEntryAddress")] = flutter::EncodableValue((intptr_t)flutter_config_open); + + fl_value_set(mapReturn, fl_value_new_string("moduleEntrySymbol"), fl_value_new_string("flutter_config_open")); + // retMap[flutter::EncodableValue("moduleEntrySymbol")] = flutter::EncodableValue("flutter_config_open"); + + //result->Success(retMap); + response = FL_METHOD_RESPONSE(fl_method_success_response_new(mapReturn)); + } + else { + response = FL_METHOD_RESPONSE(fl_method_not_implemented_response_new()); + } + + fl_method_call_respond(method_call, response, nullptr); +} + +static void ayfcorepack_plugin_dispose(GObject* object) { + G_OBJECT_CLASS(ayfcorepack_plugin_parent_class)->dispose(object); +} + +static void ayfcorepack_plugin_class_init(AyfcorepackPluginClass* klass) { + G_OBJECT_CLASS(klass)->dispose = ayfcorepack_plugin_dispose; +} + +static void ayfcorepack_plugin_init(AyfcorepackPlugin* self) {} + +static void method_call_cb(FlMethodChannel* channel, FlMethodCall* method_call, + gpointer user_data) { + AyfcorepackPlugin* plugin = AYFCOREPACK_PLUGIN(user_data); + ayfcorepack_plugin_handle_method_call(plugin, method_call); +} + +void ayfcorepack_plugin_register_with_registrar(FlPluginRegistrar* registrar) { + AyfcorepackPlugin* plugin = AYFCOREPACK_PLUGIN( + g_object_new(ayfcorepack_plugin_get_type(), nullptr)); + + g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new(); + g_autoptr(FlMethodChannel) channel = + fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar), + "ayfcorepack", + FL_METHOD_CODEC(codec)); + fl_method_channel_set_method_call_handler(channel, method_call_cb, + g_object_ref(plugin), + g_object_unref); + + g_object_unref(plugin); +} diff --git a/flutter/project_templates/linux/ayfcorepack/include/ayfcorepack/ayfcorepack_plugin.h b/flutter/project_templates/linux/ayfcorepack/include/ayfcorepack/ayfcorepack_plugin.h new file mode 100644 index 00000000..030eb9c1 --- /dev/null +++ b/flutter/project_templates/linux/ayfcorepack/include/ayfcorepack/ayfcorepack_plugin.h @@ -0,0 +1,26 @@ +#ifndef FLUTTER_PLUGIN_AYFCOREPACK_PLUGIN_H_ +#define FLUTTER_PLUGIN_AYFCOREPACK_PLUGIN_H_ + +#include + +G_BEGIN_DECLS + +#ifdef FLUTTER_PLUGIN_IMPL +#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default"))) +#else +#define FLUTTER_PLUGIN_EXPORT +#endif + +typedef struct _AyfcorepackPlugin AyfcorepackPlugin; +typedef struct { + GObjectClass parent_class; +} AyfcorepackPluginClass; + +FLUTTER_PLUGIN_EXPORT GType ayfcorepack_plugin_get_type(); + +FLUTTER_PLUGIN_EXPORT void ayfcorepack_plugin_register_with_registrar( + FlPluginRegistrar* registrar); + +G_END_DECLS + +#endif // FLUTTER_PLUGIN_AYFCOREPACK_PLUGIN_H_ diff --git a/flutter/project_templates/linux/common/ayf-sdk-local-headers.h b/flutter/project_templates/linux/common/ayf-sdk-local-headers.h new file mode 100644 index 00000000..d57fa824 --- /dev/null +++ b/flutter/project_templates/linux/common/ayf-sdk-local-headers.h @@ -0,0 +1,10 @@ +#ifndef __AYF_SDK_LOCAL_HEADERS_H__ +#define __AYF_SDK_LOCAL_HEADERS_H__ + +#define JVX_COMPONENT_ACCESS_CALLING_CONVENTION +#include "jvx_sdk.h" +#include "jvx.h" +#include "flutter_native_host_config.h" +#include "ayfstarter-native-config.h" + +#endif \ No newline at end of file diff --git a/sources/sub-projects/ayfstarter/flutter/starter_app/example/lib/models/ayf_ui_specific.dart b/sources/sub-projects/ayfstarter/flutter/starter_app/example/lib/models/ayf_ui_specific.dart index 48b87841..4b4f1e96 100644 --- a/sources/sub-projects/ayfstarter/flutter/starter_app/example/lib/models/ayf_ui_specific.dart +++ b/sources/sub-projects/ayfstarter/flutter/starter_app/example/lib/models/ayf_ui_specific.dart @@ -26,7 +26,7 @@ class AudYoFloUiModelSpecific extends AudYoFloUiModel 'Hallo Test', "/settings/testme", "Description"); AudYoFloUiModelSpecific(String routeInit) : super(routeInit) { - textApp = 'ayfstarter'; + textApp = 'starter_app'; imageNameApp = 'packages/ayfstarter/images/ayfstarter_icons/ayfstarter-logo.png';