From 7eeedcbce09da6550fcc56dd179938245155be25 Mon Sep 17 00:00:00 2001 From: Daniel Kuschny Date: Sun, 24 Dec 2023 14:13:25 +0100 Subject: [PATCH] Adjust JNI loading for Android and bump Skia to m120 (#47) --- .github/workflows/build.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/~dotnet.yml | 12 +- .github/workflows/~java.yml | 5 +- .gitmodules | 2 +- README.md | 2 +- build/Build.Java.cs | 12 +- build/Build.LibAlphaSkia.cs | 20 +- build/Build.LibSkia.cs | 1 - build/Build.Native.cs | 1 + build/Build.Node.cs | 2 +- build/Build.Windows.cs | 41 +- externals/skia | 2 +- lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs | 4 +- lib/dotnet/AlphaSkia/NativeMethods.cs | 2 + lib/dotnet/Directory.Build.props | 2 +- lib/java/.idea/gradle.xml | 2 +- lib/java/.idea/misc.xml | 1 - lib/java/android/build.gradle.kts | 63 ++- .../alphaTab/alphaSkia/AlphaSkiaAndroid.java | 27 +- lib/java/build.gradle.kts | 137 +++-- lib/java/jni/src/AlphaSkiaCanvas.cpp | 5 +- lib/java/linux/build.gradle.kts | 5 + .../alphaTab/alphaSkia/AlphaSkiaLinux.java | 25 +- lib/java/macos/build.gradle.kts | 4 + .../alphaTab/alphaSkia/AlphaSkiaMacOs.java | 29 +- .../java/alphaTab/alphaSkia/AlphaSkiaJre.java | 46 ++ .../alphaTab/alphaSkia/AlphaSkiaPlatform.java | 72 +-- lib/java/settings.gradle.kts | 7 + lib/java/windows/build.gradle.kts | 5 +- .../alphaTab/alphaSkia/AlphaSkiaWindows.java | 29 +- lib/node/addon/addon.cpp | 4 +- lib/node/alphaskia-linux/package-lock.json | 4 +- lib/node/alphaskia-linux/package.json | 2 +- lib/node/alphaskia-macos/package-lock.json | 4 +- lib/node/alphaskia-macos/package.json | 2 +- lib/node/alphaskia-windows/package-lock.json | 4 +- lib/node/alphaskia-windows/package.json | 2 +- lib/node/alphaskia/package-lock.json | 10 +- lib/node/alphaskia/package.json | 8 +- .../AlphaSkia.Test/AlphaSkia.Test.csproj | 2 +- test/dotnet/global.json | 7 - test/java/build.gradle.kts | 3 +- .../java/alphaTab/alphaSkia/test/Main.java | 14 +- test/native/src/AlphaTabGeneratedTest.cpp | 254 ++++----- test/node/package-lock.json | 496 ------------------ test/node/package.json | 2 +- test/test-generator/AlphaSkiaTestCanvas.cs | 9 +- .../AlphaSkiaUnitTestGenerator.cs | 2 +- wrapper/include/AlphaSkiaCanvas.h | 7 +- wrapper/include/alphaskia.h | 4 +- wrapper/src/AlphaSkiaCanvas.cpp | 104 +++- wrapper/src/alphaskia_canvas.cpp | 8 +- 53 files changed, 562 insertions(+), 959 deletions(-) create mode 100644 lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaJre.java delete mode 100644 test/dotnet/global.json delete mode 100644 test/node/package-lock.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f1a30e2..c0dcd1a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,6 +11,6 @@ jobs: uses: ./.github/workflows/~reusable-full-build.yml with: use-skia-cache: ${{ inputs.use-skia-cache }} - alphaskia-version: "1.0" + alphaskia-version: "2.0" is-release-build: false secrets: inherit \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3d87ff8..2e2ab89 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -17,7 +17,7 @@ jobs: uses: ./.github/workflows/~reusable-full-build.yml with: use-skia-cache: ${{ inputs.use-skia-cache }} - alphaskia-version: "1.0" + alphaskia-version: "2.0" is-release-build: ${{ inputs.is-release-build }} secrets: inherit diff --git a/.github/workflows/~dotnet.yml b/.github/workflows/~dotnet.yml index 4bd08b2..5db4179 100644 --- a/.github/workflows/~dotnet.yml +++ b/.github/workflows/~dotnet.yml @@ -19,6 +19,9 @@ jobs: dotnet: runs-on: ubuntu-latest steps: + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8' - uses: actions/checkout@v3 - uses: actions/download-artifact@v3 with: @@ -40,19 +43,22 @@ jobs: include: - runs-on: ubuntu-latest architecture: x64 - framework: net6.0 + framework: net8.0 - runs-on: macos-latest architecture: x64 - framework: net6.0 + framework: net8.0 - runs-on: windows-latest architecture: x64 - framework: net6.0 + framework: net8.0 - runs-on: windows-latest architecture: x64 framework: net48 runs-on: ${{ matrix.runs-on }} needs: [dotnet] steps: + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8' - uses: actions/checkout@v3 - uses: actions/download-artifact@v3 with: diff --git a/.github/workflows/~java.yml b/.github/workflows/~java.yml index 663f9ed..141d2df 100644 --- a/.github/workflows/~java.yml +++ b/.github/workflows/~java.yml @@ -24,6 +24,10 @@ jobs: SONATYPE_SIGNING_PASSWORD: ${{ secrets.SONATYPE_SIGNING_PASSWORD }} SONATYPE_STAGING_PROFILE_ID: ${{ secrets.SONATYPE_STAGING_PROFILE_ID }} steps: + - uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' - uses: actions/checkout@v3 - uses: actions/download-artifact@v3 with: @@ -49,7 +53,6 @@ jobs: runs-on: ${{ matrix.runs-on }} needs: [java] steps: - # even though it is installed, not all Operating systems are configured the same - uses: actions/setup-java@v3 with: distribution: 'temurin' diff --git a/.gitmodules b/.gitmodules index b4cc47d..faf3653 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,7 +5,7 @@ [submodule "externals/skia"] path = externals/skia url = https://skia.googlesource.com/skia.git - branch = chrome/m117 + branch = chrome/m120 [submodule "externals/node-api-headers"] path = externals/node-api-headers url = https://github.com/nodejs/node-api-headers.git diff --git a/README.md b/README.md index 03d0f06..36be4b3 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ alphaSkia is a special cross platform [Skia](https://skia.org/) wrapper used in alphaSkia a slightly adapted [Semantic Versioning](https://semver.org/) scheme where the `PATCH` part indicates the Skia milestone version we have integrated. -Currently we are on [Skia m117](https://github.com/CoderLine/alphaSkia/blob/main/.gitmodules#L8) +Currently we are on [Skia m120](https://github.com/CoderLine/alphaSkia/blob/main/.gitmodules#L8) Given a version number `MAJOR.MINOR.SKIA`: diff --git a/build/Build.Java.cs b/build/Build.Java.cs index fd4a001..9cfb18f 100644 --- a/build/Build.Java.cs +++ b/build/Build.Java.cs @@ -110,26 +110,24 @@ string JavaVersion get { string semVer; - if (IsLocalBuild) + if (IsReleaseBuild) { - semVer = $"{VersionInfo.FileVersion.ToString(3)}-LOCAL"; + semVer = $"{VersionInfo.FileVersion.ToString(3)}"; } - else if (!IsReleaseBuild) + else if (IsLocalBuild) { - semVer = $"{VersionInfo.FileVersion.ToString(3)}-SNAPSHOT"; + semVer = $"{VersionInfo.FileVersion.ToString(3)}-LOCAL"; } else { - semVer = $"{VersionInfo.FileVersion.ToString(3)}"; + semVer = $"{VersionInfo.FileVersion.ToString(3)}-SNAPSHOT"; } - return semVer; } } public Target JavaPublish => _ => _ .DependsOn(PrepareGitHubArtifacts) - .Requires(() => IsGitHubActions) .Executes(() => { // workaround until we know how to upload existing maven packages diff --git a/build/Build.LibAlphaSkia.cs b/build/Build.LibAlphaSkia.cs index dd3fcc5..663f5d3 100644 --- a/build/Build.LibAlphaSkia.cs +++ b/build/Build.LibAlphaSkia.cs @@ -252,25 +252,35 @@ void BuildAlphaSkia() var alphaSkiaInclude = DistBasePath / "include"; var jniInclude = JavaHome / "include"; AbsolutePath jniPlatformInclude; - if (OperatingSystem.IsWindows()) + if (OperatingSystem.IsWindows() && TargetOs == TargetOperatingSystem.Windows) { jniPlatformInclude = jniInclude / "win32"; } - else if (OperatingSystem.IsLinux()) + else if (OperatingSystem.IsLinux() && TargetOs == TargetOperatingSystem.Linux) { jniPlatformInclude = jniInclude / "linux"; } - else if (OperatingSystem.IsMacOS()) + else if (OperatingSystem.IsMacOS() && TargetOs == TargetOperatingSystem.MacOs) { jniPlatformInclude = jniInclude / "darwin"; } + else if(TargetOs == TargetOperatingSystem.Android) + { + jniPlatformInclude = null; + } else { throw new PlatformNotSupportedException(); } - AppendToFlagList(gnArgs, "extra_cflags", - $"'-I{alphaSkiaInclude}', '-I{jniInclude}', '-I{jniPlatformInclude}'"); + if(jniPlatformInclude != null) + { + AppendToFlagList(gnArgs, "extra_cflags", $"'-I{alphaSkiaInclude}', '-I{jniInclude}', '-I{jniPlatformInclude}'"); + } + else + { + AppendToFlagList(gnArgs, "extra_cflags", $"'-I{alphaSkiaInclude}'"); + } } else if (Variant == Variant.Node) { diff --git a/build/Build.LibSkia.cs b/build/Build.LibSkia.cs index 9223176..becadfc 100644 --- a/build/Build.LibSkia.cs +++ b/build/Build.LibSkia.cs @@ -163,7 +163,6 @@ void BuildSkia() gnArgs["skia_use_sfntly"] = "false"; gnArgs["skia_enable_skshaper"] = "true"; gnArgs["skia_pdf_subset_harfbuzz"] = "false"; - gnArgs["skia_use_expat"] = "false"; gnArgs["skia_enable_pdf"] = "false"; gnArgs["skia_use_dng_sdk"] = "false"; gnArgs["skia_use_libjpeg_turbo_decode"] = "false"; diff --git a/build/Build.Native.cs b/build/Build.Native.cs index fb0f0d9..35b553d 100644 --- a/build/Build.Native.cs +++ b/build/Build.Native.cs @@ -316,6 +316,7 @@ Dictionary PrepareNativeBuild(Variant variant) if (TargetOs == TargetOperatingSystem.Android) { gnArgs["ndk"] = NdkPath; + AppendToFlagList(gnArgs, "extra_ldflags", $"'-llog'"); } gnArgs["target_os"] = TargetOs.SkiaTargetOs; diff --git a/build/Build.Node.cs b/build/Build.Node.cs index 5bf95d5..20916b0 100644 --- a/build/Build.Node.cs +++ b/build/Build.Node.cs @@ -64,7 +64,7 @@ void PrepareTgzForTest() var files = new System.Collections.Generic.List(); foreach (var tgz in (RootDirectory / "dist" / "nodetars").GetFiles("*.tgz")) { - // coderline-alphaskia-1.0.0-local.0.tgz + // coderline-alphaskia-2.0.0-local.0.tgz var nameWithoutVersion = string.Join("-", tgz.NameWithoutExtension.Split('-').TakeWhile(p => !char.IsDigit(p[0]))) + tgz.Extension; diff --git a/build/Build.Windows.cs b/build/Build.Windows.cs index ed0e7e0..c1fc939 100644 --- a/build/Build.Windows.cs +++ b/build/Build.Windows.cs @@ -34,30 +34,33 @@ string VsInstall void SetClangWindows(Dictionary gnArgs) { - if (!string.IsNullOrEmpty(LlvmHome)) + if(TargetOs == TargetOperatingSystem.Windows) { - gnArgs["clang_win"] = LlvmHome; + if (!string.IsNullOrEmpty(LlvmHome)) + { + gnArgs["clang_win"] = LlvmHome; + + // there is a problem in the BUILDCONFIG.gn of Skia looking for a version number like 16.0.0 + // but with the installation on windows it is simply 16. + var version = ((AbsolutePath)LlvmHome) / "lib" / "clang"; + var newestVersion = version.GetDirectories().MaxBy(d => d.Name); + if (!string.IsNullOrEmpty(newestVersion)) + { + gnArgs["clang_win_version"] = newestVersion.Name; + } + } - // there is a problem in the BUILDCONFIG.gn of Skia looking for a version number like 16.0.0 - // but with the installation on windows it is simply 16. - var version = ((AbsolutePath)LlvmHome) / "lib" / "clang"; - var newestVersion = version.GetDirectories().MaxBy(d => d.Name); - if (!string.IsNullOrEmpty(newestVersion)) + // override win_vc with the command line args + var vsInstall = VsInstall; + if (!string.IsNullOrEmpty(vsInstall)) { - gnArgs["clang_win_version"] = newestVersion.Name; + AbsolutePath winVc = vsInstall; + winVc /= "VC"; + gnArgs["win_vc"] = winVc; } - } - // override win_vc with the command line args - var vsInstall = VsInstall; - if (!string.IsNullOrEmpty(vsInstall)) - { - AbsolutePath winVc = vsInstall; - winVc /= "VC"; - gnArgs["win_vc"] = winVc; + AppendToFlagList(gnArgs, "extra_cflags", "'/MT', '/EHsc', '/Z7', '-D_HAS_AUTO_PTR_ETC=1'"); + AppendToFlagList(gnArgs, "extra_ldflags", "'/DEBUG:FULL'"); } - - AppendToFlagList(gnArgs, "extra_cflags", "'/MT', '/EHsc', '/Z7', '-D_HAS_AUTO_PTR_ETC=1'"); - AppendToFlagList(gnArgs, "extra_ldflags", "'/DEBUG:FULL'"); } } \ No newline at end of file diff --git a/externals/skia b/externals/skia index beb4d7d..349c117 160000 --- a/externals/skia +++ b/externals/skia @@ -1 +1 @@ -Subproject commit beb4d7d77fba1e7c44b82653090e176bac161d63 +Subproject commit 349c1179c43ef46f2804404952b9460dc007d76a diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs b/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs index 7b5ecbf..db58587 100644 --- a/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs +++ b/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs @@ -272,7 +272,7 @@ public void FillText(string text, AlphaSkiaTypeface typeface, float fontSize, fl AlphaSkiaTextBaseline baseline) { CheckDisposed(); - NativeMethods.alphaskia_canvas_fill_text(Handle, text, typeface.Handle, fontSize, x, y, textAlign, baseline); + NativeMethods.alphaskia_canvas_fill_text(Handle, text, text.Length, typeface.Handle, fontSize, x, y, textAlign, baseline); } /// @@ -285,7 +285,7 @@ public void FillText(string text, AlphaSkiaTypeface typeface, float fontSize, fl public float MeasureText(string text, AlphaSkiaTypeface typeface, float fontSize) { CheckDisposed(); - return NativeMethods.alphaskia_canvas_measure_text(Handle, text, typeface.Handle, fontSize); + return NativeMethods.alphaskia_canvas_measure_text(Handle, text, text.Length, typeface.Handle, fontSize); } /// diff --git a/lib/dotnet/AlphaSkia/NativeMethods.cs b/lib/dotnet/AlphaSkia/NativeMethods.cs index 155b311..bf93ead 100644 --- a/lib/dotnet/AlphaSkia/NativeMethods.cs +++ b/lib/dotnet/AlphaSkia/NativeMethods.cs @@ -150,6 +150,7 @@ public static extern void alphaskia_canvas_bezier_curve_to(alphaskia_canvas_t ca public static extern void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, [MarshalAs(UnmanagedType.LPWStr)] string text, + int text_length, alphaskia_typeface_t type_face, float font_size, float x, float y, AlphaSkiaTextAlign text_align, AlphaSkiaTextBaseline baseline); @@ -157,6 +158,7 @@ public static extern void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, public static extern float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, [MarshalAs(UnmanagedType.LPWStr)] string text, + int text_length, alphaskia_typeface_t type_face, float font_size); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] diff --git a/lib/dotnet/Directory.Build.props b/lib/dotnet/Directory.Build.props index cd62c37..fcf12e9 100644 --- a/lib/dotnet/Directory.Build.props +++ b/lib/dotnet/Directory.Build.props @@ -3,7 +3,7 @@ portable true - 1.0.0 + 2.0.0 $(Version).0 $(AssemblyVersion) en diff --git a/lib/java/.idea/gradle.xml b/lib/java/.idea/gradle.xml index 5bd1ce6..d509473 100644 --- a/lib/java/.idea/gradle.xml +++ b/lib/java/.idea/gradle.xml @@ -5,7 +5,7 @@