Skip to content

Commit e3f9f6c

Browse files
committed
Merge remote-tracking branch 'remotes/AmSmart/feature/add-android-support' into update_apr_2025
2 parents c06f458 + bc4bdf9 commit e3f9f6c

40 files changed

+1368
-85
lines changed

.github/workflows/compile.yml

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -539,19 +539,17 @@ jobs:
539539
if-no-files-found: error
540540

541541
compile-android:
542-
# Disable android build
543-
if: false
544-
542+
name: Compile (Android)
545543
strategy:
546544
fail-fast: true
547545
matrix:
548546
include:
549547
- build: 'x86'
550-
defines: '-DANDROID_ABI=x86'
548+
defines: '-DANDROID_ABI=x86 -DCMAKE_C_FLAGS=-march=i686 -DCMAKE_CXX_FLAGS=-march=i686'
551549
- build: 'x86_64'
552-
defines: '-DANDROID_ABI=x86_64'
550+
defines: '-DANDROID_ABI=x86_64 -DCMAKE_C_FLAGS=-march=x86-64 -DCMAKE_CXX_FLAGS=-march=x86-64'
553551
- build: 'arm64-v8a'
554-
defines: '-DANDROID_ABI=arm64-v8a'
552+
defines: '-DANDROID_ABI=arm64-v8a -DCMAKE_C_FLAGS=-march=armv8.7a -DCMAKE_C_FLAGS=-march=armv8.7a'
555553
runs-on: ubuntu-24.04
556554
steps:
557555
- uses: actions/checkout@v4
@@ -567,28 +565,39 @@ jobs:
567565
- name: Build
568566
id: cmake_build
569567
env:
570-
CMAKE_FLAGS: '-DCMAKE_TOOLCHAIN_FILE=${{ steps.setup-ndk.outputs.ndk-path }}/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-23'
568+
CMAKE_FLAGS: '-DCMAKE_TOOLCHAIN_FILE=${{ steps.setup-ndk.outputs.ndk-path }}/build/cmake/android.toolchain.cmake -DANDROID_PLATFORM=android-23 -DGGML_OPENMP=OFF -DGGML_LLAMAFILE=OFF'
571569
run: |
572-
mkdir build
573-
cd build
574-
cmake .. ${{ env.COMMON_DEFINE }} ${{ env.CMAKE_FLAGS }} ${{ matrix.defines }}
575-
cmake --build . --config Release -j ${env:NUMBER_OF_PROCESSORS}
576-
cd ..
577-
ls -R
570+
# export-lora not supported on 32 bit machines hence breaks x86 build
571+
sed -i '/add_subdirectory(export-lora)/d' examples/CMakeLists.txt # remove export-lora from examples
572+
cmake ${{ env.COMMON_DEFINE }} ${{ env.CMAKE_FLAGS }} ${{ matrix.defines }} -B build
573+
cmake --build build --config Release -j ${env:NUMBER_OF_PROCESSORS}
578574
- name: Upload Llama
579575
uses: actions/upload-artifact@v4
580576
with:
581-
path: ./build/src/libllama.so
577+
path: ./build/bin/libllama.so
582578
name: llama-bin-android-${{ matrix.build }}.so
583-
- uses: actions/upload-artifact@v4
579+
- name: Upload GGML
580+
uses: actions/upload-artifact@v4
584581
with:
585-
path: ./build/ggml/src/libggml.so
582+
path: ./build/bin/libggml.so
586583
name: ggml-bin-android-${{ matrix.build }}.so
587584
if-no-files-found: error
585+
- name: Upload GGML Base
586+
uses: actions/upload-artifact@v4
587+
with:
588+
path: ./build/bin/libggml-base.so
589+
name: ggml-base-bin-android-${{ matrix.build }}.so
590+
if-no-files-found: error
591+
- name: Upload GGML CPU
592+
uses: actions/upload-artifact@v4
593+
with:
594+
path: ./build/bin/libggml-cpu.so
595+
name: ggml-cpu-bin-android-${{ matrix.build }}.so
596+
if-no-files-found: error
588597
- name: Upload Llava
589598
uses: actions/upload-artifact@v4
590599
with:
591-
path: ./build/examples/llava/libllava_shared.so
600+
path: ./build/bin/libllava_shared.so
592601
name: llava-bin-android-${{ matrix.build }}.so
593602

594603
build-deps:
@@ -722,17 +731,23 @@ jobs:
722731
cp artifacts/llava-bin-osx-x64-rosetta2.dylib/libllava_shared.dylib deps/osx-x64-rosetta2/libllava_shared.dylib
723732
724733
# Android
725-
#cp artifacts/ggml-bin-android-arm64-v8a.so/libggml.so deps/android-arm64-v8a/libggml.so
726-
#cp artifacts/llama-bin-android-arm64-v8a.so/libllama.so deps/android-arm64-v8a/libllama.so
727-
#cp artifacts/llava-bin-android-arm64-v8a.so/libllava_shared.so deps/android-arm64-v8a/libllava_shared.so
728-
729-
#cp artifacts/ggml-bin-android-x86.so/libggml.so deps/android-x86/libggml.so
730-
#cp artifacts/llama-bin-android-x86.so/libllama.so deps/android-x86/libllama.so
731-
#cp artifacts/llava-bin-android-x86.so/libllava_shared.so deps/android-x86/libllava_shared.so
732-
733-
#cp artifacts/ggml-bin-android-x86_64.so/libggml.so deps/android-x86_64/libggml.so
734-
#cp artifacts/llama-bin-android-x86_64.so/libllama.so deps/android-x86_64/libllama.so
735-
#cp artifacts/llava-bin-android-x86_64.so/libllava_shared.so deps/android-x86_64/libllava_shared.so
734+
cp artifacts/ggml-bin-android-arm64-v8a.so/libggml.so deps/android-arm64-v8a/libggml.so
735+
cp artifacts/ggml-base-bin-android-arm64-v8a.so/libggml-base.so deps/android-arm64-v8a/libggml-base.so
736+
cp artifacts/ggml-cpu-bin-android-arm64-v8a.so/libggml-cpu.so deps/android-arm64-v8a/libggml-cpu.so
737+
cp artifacts/llama-bin-android-arm64-v8a.so/libllama.so deps/android-arm64-v8a/libllama.so
738+
cp artifacts/llava-bin-android-arm64-v8a.so/libllava_shared.so deps/android-arm64-v8a/libllava_shared.so
739+
740+
cp artifacts/ggml-bin-android-x86.so/libggml.so deps/android-x86/libggml.so
741+
cp artifacts/ggml-base-bin-android-x86.so/libggml-base.so deps/android-x86/libggml-base.so
742+
cp artifacts/ggml-cpu-bin-android-x86.so/libggml-cpu.so deps/android-x86/libggml-cpu.so
743+
cp artifacts/llama-bin-android-x86.so/libllama.so deps/android-x86/libllama.so
744+
cp artifacts/llava-bin-android-x86.so/libllava_shared.so deps/android-x86/libllava_shared.so
745+
746+
cp artifacts/ggml-bin-android-x86_64.so/libggml.so deps/android-x86_64/libggml.so
747+
cp artifacts/ggml-base-bin-android-x86_64.so/libggml-base.so deps/android-x86_64/libggml-base.so
748+
cp artifacts/ggml-cpu-bin-android-x86_64.so/libggml-cpu.so deps/android-x86_64/libggml-cpu.so
749+
cp artifacts/llama-bin-android-x86_64.so/libllama.so deps/android-x86_64/libllama.so
750+
cp artifacts/llava-bin-android-x86_64.so/libllava_shared.so deps/android-x86_64/libllava_shared.so
736751
737752
# Windows CUDA
738753
cp artifacts/ggml-bin-win-cublas-cu11.7.1-x64.dll/ggml.dll deps/cu11.7.1/ggml.dll

.github/workflows/main.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ jobs:
3838
with:
3939
dotnet-version: |
4040
8.0.x
41+
- name: Install Mobile Workloads
42+
run: |
43+
dotnet workload install android --ignore-failed-sources
44+
dotnet workload install maui --ignore-failed-sources
4145
- name: Cache Packages
4246
uses: actions/cache@v4
4347
with:

LLama/LLamaSharp.Runtime.targets

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,4 +488,94 @@
488488
<Link>runtimes/linux-x64/native/vulkan/libllava_shared.so</Link>
489489
</None>
490490
</ItemGroup>
491+
492+
<!-- Android Native Libs (Start) -->
493+
<ItemGroup
494+
Condition="$(AndroidSupportedAbis.Contains('x86')) or $(RuntimeIdentifiers.Contains('android-x86'))">
495+
<AndroidNativeLibrary Visible="false"
496+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86/libllama.so">
497+
<Link>runtimes/android-x86/native/libllama.so</Link>
498+
<Abi>x86</Abi>
499+
</AndroidNativeLibrary>
500+
<AndroidNativeLibrary Visible="false"
501+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86/libggml.so">
502+
<Link>runtimes/android-x86/native/libggml.so</Link>
503+
<Abi>x86</Abi>
504+
</AndroidNativeLibrary>
505+
<AndroidNativeLibrary Visible="false"
506+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86/libggml-base.so">
507+
<Link>runtimes/android-x86/native/libggml-base.so</Link>
508+
<Abi>x86</Abi>
509+
</AndroidNativeLibrary>
510+
<AndroidNativeLibrary Visible="false"
511+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86/libggml-cpu.so">
512+
<Link>runtimes/android-x86/native/libggml-cpu.so</Link>
513+
<Abi>x86</Abi>
514+
</AndroidNativeLibrary>
515+
<AndroidNativeLibrary Visible="false"
516+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86/libllava_shared.so">
517+
<Link>runtimes/android-x86/native/libllava_shared.so</Link>
518+
<Abi>x86</Abi>
519+
</AndroidNativeLibrary>
520+
</ItemGroup>
521+
522+
<ItemGroup
523+
Condition="$(AndroidSupportedAbis.Contains('x86_64')) or $(RuntimeIdentifiers.Contains('android-x64'))">
524+
<AndroidNativeLibrary Visible="false"
525+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86_64/libllama.so">
526+
<Link>lib/x86_64/libllama.so</Link>
527+
<Abi>x86_64</Abi>
528+
</AndroidNativeLibrary>
529+
<AndroidNativeLibrary Visible="false"
530+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86_64/libggml.so">
531+
<Link>lib/x86_64/libggml.so</Link>
532+
<Abi>x86_64</Abi>
533+
</AndroidNativeLibrary>
534+
<AndroidNativeLibrary Visible="false"
535+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86_64/libggml-base.so">
536+
<Link>lib/x86_64/libggml-base.so</Link>
537+
<Abi>x86_64</Abi>
538+
</AndroidNativeLibrary>
539+
<AndroidNativeLibrary Visible="false"
540+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86_64/libggml-cpu.so">
541+
<Link>lib/x86_64/libggml-cpu.so</Link>
542+
<Abi>x86_64</Abi>
543+
</AndroidNativeLibrary>
544+
<AndroidNativeLibrary Visible="false"
545+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-x86_64/libllava_shared.so">
546+
<Link>lib/x86_64/libllava_shared.so</Link>
547+
<Abi>x86_64</Abi>
548+
</AndroidNativeLibrary>
549+
</ItemGroup>
550+
551+
<ItemGroup
552+
Condition="$(AndroidSupportedAbis.Contains('arm64-v8a')) or $(RuntimeIdentifiers.Contains('android-arm64'))">
553+
<AndroidNativeLibrary Visible="false"
554+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-arm64-v8a/libllama.so">
555+
<Link>lib/arm64-v8a/libllama.so</Link>
556+
<Abi>arm64-v8a</Abi>
557+
</AndroidNativeLibrary>
558+
<AndroidNativeLibrary Visible="false"
559+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-arm64-v8a/libggml.so">
560+
<Link>lib/arm64-v8a/libggml.so</Link>
561+
<Abi>arm64-v8a</Abi>
562+
</AndroidNativeLibrary>
563+
<AndroidNativeLibrary Visible="false"
564+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-arm64-v8a/libggml-base.so">
565+
<Link>lib/arm64-v8a/libggml-base.so</Link>
566+
<Abi>arm64-v8a</Abi>
567+
</AndroidNativeLibrary>
568+
<AndroidNativeLibrary Visible="false"
569+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-arm64-v8a/libggml-cpu.so">
570+
<Link>lib/arm64-v8a/libggml-cpu.so</Link>
571+
<Abi>arm64-v8a</Abi>
572+
</AndroidNativeLibrary>
573+
<AndroidNativeLibrary Visible="false"
574+
Include="$(MSBuildThisFileDirectory)runtimes/deps/android-arm64-v8a/libllava_shared.so">
575+
<Link>lib/arm64-v8a/libllava_shared.so</Link>
576+
<Abi>arm64-v8a</Abi>
577+
</AndroidNativeLibrary>
578+
</ItemGroup>
579+
<!-- Android Native Libs (End) -->
580+
491581
</Project>

LLama/Native/NativeApi.Load.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ private static void SetDllImportResolver()
5353
// NativeLibrary is not available on older runtimes. We'll have to depend on
5454
// the normal runtime dll resolution there.
5555
#if NET5_0_OR_GREATER
56+
if (OperatingSystem.IsAndroid())
57+
{
58+
// Android doesn't support DllImportResolver, so we have to rely on the default search path
59+
return;
60+
}
61+
5662
NativeLibrary.SetDllImportResolver(typeof(NativeApi).Assembly, (name, _, _) =>
5763
{
5864
if (name == "llama")
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<package >
3+
<metadata>
4+
<id>LLamaSharp.Backend.Cpu.Android</id>
5+
<version>$version$</version>
6+
<title>LLamaSharp.Backend.Cpu.Android, the backend for LLamaSharp</title>
7+
<authors>llama.cpp Authors</authors>
8+
<requireLicenseAcceptance>false</requireLicenseAcceptance>
9+
<license type="expression">MIT</license>
10+
<icon>icon512.png</icon>
11+
<projectUrl>https://github.com/SciSharp/LLamaSharp</projectUrl>
12+
<description>LLamaSharp.Backend.Cpu.Android is a backend for LLamaSharp to use with Android Cpu only.</description>
13+
<releaseNotes></releaseNotes>
14+
<copyright>Copyright 2023 The llama.cpp Authors. All rights reserved.</copyright>
15+
<tags>LLamaSharp LLama LLM GPT AI ChatBot SciSharp</tags>
16+
</metadata>
17+
18+
<files>
19+
<file src="LLamaSharpBackend.props" target="build/netstandard2.0/LLamaSharp.Backend.Cpu.Android.props" />
20+
21+
<file src="runtimes/deps/android-arm64-v8a/libllama.so" target="runtimes\android-arm64-v8a\native\libllama.so" />
22+
<file src="runtimes/deps/android-arm64-v8a/libggml.so" target="runtimes\android-arm64-v8a\native\libggml.so" />
23+
<file src="runtimes/deps/android-arm64-v8a/libggml-base.so" target="runtimes\android-arm64-v8a\native\libggml-base.so" />
24+
<file src="runtimes/deps/android-arm64-v8a/libggml-cpu.so" target="runtimes\android-arm64-v8a\native\libggml-cpu.so" />
25+
<file src="runtimes/deps/android-arm64-v8a/libllava_shared.so" target="runtimes\android-arm64-v8a\native\libllava_shared.so" />
26+
27+
<file src="runtimes/deps/android-x86_64/libllama.so" target="runtimes\android-x86_64\native\libllama.so" />
28+
<file src="runtimes/deps/android-x86_64/libggml.so" target="runtimes\android-x86_64\native\libggml.so" />
29+
<file src="runtimes/deps/android-x86_64/libggml-base.so" target="runtimes\android-x86_64\native\libggml-base.so" />
30+
<file src="runtimes/deps/android-x86_64/libggml-cpu.so" target="runtimes\android-x86_64\native\libggml-cpu.so" />
31+
<file src="runtimes/deps/android-x86_64/libllava_shared.so" target="runtimes\android-x86_64\native\libllava_shared.so" />
32+
33+
<file src="runtimes/deps/android-x86/libllama.so" target="runtimes\android-x86\native\libllama.so" />
34+
<file src="runtimes/deps/android-x86/libggml.so" target="runtimes\android-x86\native\libggml.so" />
35+
<file src="runtimes/deps/android-x86/libggml-base.so" target="runtimes\android-x86\native\libggml-base.so" />
36+
<file src="runtimes/deps/android-x86/libggml-cpu.so" target="runtimes\android-x86\native\libggml-cpu.so" />
37+
<file src="runtimes/deps/android-x86/libllava_shared.so" target="runtimes\android-x86\native\libllava_shared.so" />
38+
39+
<file src="icon512.png" target="icon512.png" />
40+
</files>
41+
</package>

0 commit comments

Comments
 (0)