Skip to content

Commit c492694

Browse files
committed
Add sqlite-xamarin (native library) build.
sqlite needs to be built by our own because Android N or later will require that any non-public system library cannot be loaded.
1 parent 7f0e1ec commit c492694

File tree

8 files changed

+297
-0
lines changed

8 files changed

+297
-0
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,6 @@
66
path = external/mono
77
url = https://github.com/mono/mono.git
88
branch = mono-4.5.0-branch
9+
[submodule "external/sqlite"]
10+
path = external/sqlite
11+
url = https://github.com/xamarin/sqlite.git

external/sqlite

Submodule sqlite added at 382b7be
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<PropertyGroup>
4+
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
5+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6+
<ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
7+
<ProjectGuid>{26781D3A-FF20-4F55-9824-C8A06AA9E484}</ProjectGuid>
8+
<OutputType>Library</OutputType>
9+
<RootNamespace>Mono.Data.Sqlite</RootNamespace>
10+
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
11+
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
12+
<AndroidResgenClass>Resource</AndroidResgenClass>
13+
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
14+
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
15+
<AssemblyName>Mono.Data.Sqlite</AssemblyName>
16+
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
17+
</PropertyGroup>
18+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
19+
<DebugSymbols>true</DebugSymbols>
20+
<DebugType>full</DebugType>
21+
<Optimize>false</Optimize>
22+
<OutputPath>..\..\bin\$(Configuration)\lib\xbuild-frameworks\MonoAndroid\v1.0</OutputPath>
23+
<DefineConstants>DEBUG;TRACE;NET_4_0;NET_4_5;MONO;DISABLE_CAS_USE;SQLITE_STANDARD;MONODROID</DefineConstants>
24+
<ErrorReport>prompt</ErrorReport>
25+
<WarningLevel>4</WarningLevel>
26+
<AndroidLinkMode>None</AndroidLinkMode>
27+
<ConsolePause>false</ConsolePause>
28+
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
29+
</PropertyGroup>
30+
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
31+
<Optimize>true</Optimize>
32+
<OutputPath>..\..\bin\$(Configuration)\lib\xbuild-frameworks\MonoAndroid\v1.0</OutputPath>
33+
<ErrorReport>prompt</ErrorReport>
34+
<WarningLevel>4</WarningLevel>
35+
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
36+
<ConsolePause>false</ConsolePause>
37+
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
38+
<DefineConstants>NET_4_0;NET_4_5;MONO;DISABLE_CAS_USE;SQLITE_STANDARD;MONODROID</DefineConstants>
39+
</PropertyGroup>
40+
<Import Project="..\..\Configuration.props" />
41+
<ItemGroup>
42+
<Reference Include="System" />
43+
<Reference Include="System.Xml" />
44+
<Reference Include="System.Core" />
45+
<Reference Include="System.Data" />
46+
<Reference Include="System.Transactions" />
47+
<Reference Include="Mono.Android" />
48+
</ItemGroup>
49+
<ItemGroup>
50+
<None Include="Mono.Data.Sqlite.dll.config">
51+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
52+
</None>
53+
</ItemGroup>
54+
<ItemGroup>
55+
<Compile Include="$(XamarinAndroidSourcePath)\src\Mono.Android\Android.Runtime\CPUArchitecture.cs">
56+
<Link>Android.Runtime\CPUArchitecture.cs</Link>
57+
</Compile>
58+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Assembly\AssemblyInfo.cs">
59+
<Link>Assembly\AssemblyInfo.cs</Link>
60+
</Compile>
61+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\MonoPInvokeCallbackAttribute.cs">
62+
<Link>Mono.Data.Sqlite_2.0\MonoPInvokeCallbackAttribute.cs</Link>
63+
</Compile>
64+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLite3.cs">
65+
<Link>Mono.Data.Sqlite_2.0\SQLite3.cs</Link>
66+
</Compile>
67+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLite3_UTF16.cs">
68+
<Link>Mono.Data.Sqlite_2.0\SQLite3_UTF16.cs</Link>
69+
</Compile>
70+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteBase.cs">
71+
<Link>Mono.Data.Sqlite_2.0\SQLiteBase.cs</Link>
72+
</Compile>
73+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteCommandBuilder.cs">
74+
<Link>Mono.Data.Sqlite_2.0\SQLiteCommandBuilder.cs</Link>
75+
</Compile>
76+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteCommand.cs">
77+
<Link>Mono.Data.Sqlite_2.0\SQLiteCommand.cs</Link>
78+
</Compile>
79+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteConnection.cs">
80+
<Link>Mono.Data.Sqlite_2.0\SQLiteConnection.cs</Link>
81+
</Compile>
82+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\LINQ\SQLiteConnection_Linq.cs">
83+
<Link>Mono.Data.Sqlite_2.0\LINQ\SQLiteConnection_Linq.cs</Link>
84+
</Compile>
85+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteConnectionPool.cs">
86+
<Link>Mono.Data.Sqlite_2.0\SQLiteConnectionPool.cs</Link>
87+
</Compile>
88+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteConnectionStringBuilder.cs">
89+
<Link>Mono.Data.Sqlite_2.0\SQLiteConnectionStringBuilder.cs</Link>
90+
</Compile>
91+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteConvert.cs">
92+
<Link>Mono.Data.Sqlite_2.0\SQLiteConvert.cs</Link>
93+
</Compile>
94+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteDataAdapter.cs">
95+
<Link>Mono.Data.Sqlite_2.0\SQLiteDataAdapter.cs</Link>
96+
</Compile>
97+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteDataReader.cs">
98+
<Link>Mono.Data.Sqlite_2.0\SQLiteDataReader.cs</Link>
99+
</Compile>
100+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SqliteDataSourceEnumerator.cs">
101+
<Link>Mono.Data.Sqlite_2.0\SqliteDataSourceEnumerator.cs</Link>
102+
</Compile>
103+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteEnlistment.cs">
104+
<Link>Mono.Data.Sqlite_2.0\SQLiteEnlistment.cs</Link>
105+
</Compile>
106+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteException.cs">
107+
<Link>Mono.Data.Sqlite_2.0\SQLiteException.cs</Link>
108+
</Compile>
109+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteFactory.cs">
110+
<Link>Mono.Data.Sqlite_2.0\SQLiteFactory.cs</Link>
111+
</Compile>
112+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\LINQ\SQLiteFactory_Linq.cs">
113+
<Link>Mono.Data.Sqlite_2.0\LINQ\SQLiteFactory_Linq.cs</Link>
114+
</Compile>
115+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteFunctionAttribute.cs">
116+
<Link>Mono.Data.Sqlite_2.0\SQLiteFunctionAttribute.cs</Link>
117+
</Compile>
118+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteFunction.cs">
119+
<Link>Mono.Data.Sqlite_2.0\SQLiteFunction.cs</Link>
120+
</Compile>
121+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteKeyReader.cs">
122+
<Link>Mono.Data.Sqlite_2.0\SQLiteKeyReader.cs</Link>
123+
</Compile>
124+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteMetaDataCollectionNames.cs">
125+
<Link>Mono.Data.Sqlite_2.0\SQLiteMetaDataCollectionNames.cs</Link>
126+
</Compile>
127+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteParameterCollection.cs">
128+
<Link>Mono.Data.Sqlite_2.0\SQLiteParameterCollection.cs</Link>
129+
</Compile>
130+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteParameter.cs">
131+
<Link>Mono.Data.Sqlite_2.0\SQLiteParameter.cs</Link>
132+
</Compile>
133+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteStatement.cs">
134+
<Link>Mono.Data.Sqlite_2.0\SQLiteStatement.cs</Link>
135+
</Compile>
136+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SQLiteTransaction.cs">
137+
<Link>Mono.Data.Sqlite_2.0\SQLiteTransaction.cs</Link>
138+
</Compile>
139+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\SR.Designer.cs">
140+
<Link>Mono.Data.Sqlite_2.0\SR.Designer.cs</Link>
141+
</Compile>
142+
<Compile Include="$(MonoSourceDirectory)\mcs\class\Mono.Data.Sqlite\Mono.Data.Sqlite_2.0\UnsafeNativeMethods.cs">
143+
<Link>Mono.Data.Sqlite_2.0\UnsafeNativeMethods.cs</Link>
144+
</Compile>
145+
<Compile Include="$(MonoSourceDirectory)\mcs\build\common\Locale.cs">
146+
<Link>Locale.cs</Link>
147+
</Compile>
148+
<Compile Include="$(MonoSourceDirectory)\mcs\build\common\Consts.cs">
149+
<Link>Consts.cs</Link>
150+
</Compile>
151+
</ItemGroup>
152+
<Import Project="$(OutputPath)\..\..\..\xbuild\Xamarin\Android\Xamarin.Android.CSharp.targets" />
153+
<ItemGroup>
154+
<Folder Include="Assembly\" />
155+
<Folder Include="Mono.Data.Sqlite\" />
156+
</ItemGroup>
157+
<ItemGroup>
158+
<_SupportedAbi Include="$(AndroidSupportedAbis)" />
159+
<EmbeddedNativeLibrary Include="@(_SuppportedAbi->'..\sqlite-xamarin\src\main\libs\@(_SupportedAbi)\libsqlite3_xamarin.so')" />
160+
</ItemGroup>
161+
</Project>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<configuration>
2+
<dllmap dll="sqlite3" target="libsqlite3_xamarin.so" />
3+
</configuration>

src/sqlite-xamarin/.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.stamp
2+
build.gradle
3+
gradle/
4+
gradlew
5+
gradlew.bat
6+
src/
7+
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2+
3+
<PropertyGroup>
4+
<Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
5+
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
6+
<ItemType>GenericProject</ItemType>
7+
<ProjectGuid>{B8F799C5-D7CE-4E09-9CE6-BAA4173E7EC8}</ProjectGuid>
8+
</PropertyGroup>
9+
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
10+
<OutputPath>..\..\bin\Debug\</OutputPath>
11+
</PropertyGroup>
12+
<PropertyGroup Condition="'$(Configuration)'=='Release'">
13+
<OutputPath>..\..\bin\Release\</OutputPath>
14+
</PropertyGroup>
15+
16+
<PropertyGroup>
17+
<BuildDependsOn>
18+
_CreateProject;
19+
_NdkBuild;
20+
</BuildDependsOn>
21+
</PropertyGroup>
22+
23+
<Import Project="..\..\Configuration.props" />
24+
25+
<!-- Build target and co. -->
26+
27+
<Target Name="Build" DependsOnTargets="$(BuildDependsOn)" />
28+
29+
<Target Name="_CreateProject">
30+
<Exec Condition="!Exists('src')"
31+
Command="$(ANDROID_SDK_PATH)\tools\android create project -g -n sqlitesample -p . -a MainActivity -t android-10 --package com.xamarin.sqlitesample -v 1.0.0" />
32+
<Copy Condition="!Exists('src\stamp')"
33+
SourceFiles="src-jni\Application.mk;src-jni\Android.mk"
34+
DestinationFiles="src\main\jni\Application.mk;src\main\jni\Android.mk" />
35+
<Touch Files="src\stamp" AlwaysCreate="true" />
36+
</Target>
37+
38+
<Target Name="_NdkBuild">
39+
<Exec Command="$(ANDROID_NDK_PATH)\ndk-build"
40+
WorkingDirectory="src\main\jni" />
41+
42+
<!-- build outputs are:
43+
src/main/libs/x86/libsqlite3_xamarin.so
44+
src/main/libs/armeabi-v7a/libsqlite3_xamarin.so
45+
src/main/libs/armeabi/libsqlite3_xamarin.so
46+
src/main/libs/arm64-v8a/libsqlite3_xamarin.so
47+
src/main/libs/x86_64/libsqlite3_xamarin.so
48+
-->
49+
</Target>
50+
51+
<!-- Clean target -->
52+
53+
<Target Name="Clean">
54+
<Delete
55+
Files="build.gradle;gradlew;gradlew.bat;local.properties" />
56+
<RemoveDir Directories="gradle;src" />
57+
</Target>
58+
</Project>
59+
60+

src/sqlite-xamarin/src-jni/Android.mk

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# It is based on sqlite/dist/Android.mk with some changes.
2+
3+
##
4+
##
5+
## Build the library
6+
##
7+
##
8+
9+
LOCAL_PATH:= $(call my-dir)
10+
11+
# NOTE the following flags,
12+
# SQLITE_TEMP_STORE=3 causes all TEMP files to go into RAM. and thats the behavior we want
13+
# SQLITE_ENABLE_FTS3 enables usage of FTS3 - NOT FTS1 or 2.
14+
# SQLITE_DEFAULT_AUTOVACUUM=1 causes the databases to be subject to auto-vacuum
15+
minimal_sqlite_flags := \
16+
-DNO_ANDROID_FUNCS=1 \
17+
-DHAVE_POSIX_FALLOCATE=0 \
18+
-DNDEBUG=1 \
19+
-DHAVE_USLEEP=1 \
20+
-DSQLITE_HAVE_ISNAN \
21+
-DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
22+
-DSQLITE_THREADSAFE=2 \
23+
-DSQLITE_TEMP_STORE=3 \
24+
-DSQLITE_POWERSAFE_OVERWRITE=1 \
25+
-DSQLITE_DEFAULT_FILE_FORMAT=4 \
26+
-DSQLITE_DEFAULT_AUTOVACUUM=1 \
27+
-DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 \
28+
-DSQLITE_ENABLE_FTS3 \
29+
-DSQLITE_ENABLE_FTS3_BACKWARDS \
30+
-DSQLITE_ENABLE_FTS4 \
31+
-DSQLITE_OMIT_BUILTIN_TEST \
32+
-DSQLITE_OMIT_COMPILEOPTION_DIAGS \
33+
-DSQLITE_OMIT_LOAD_EXTENSION \
34+
-DSQLITE_DEFAULT_FILE_PERMISSIONS=0600
35+
36+
device_sqlite_flags := $(minimal_sqlite_flags) \
37+
-DHAVE_MALLOC_H=1
38+
39+
common_src_files := ../../../../../external/sqlite/dist/sqlite3.c
40+
41+
# the device library
42+
include $(CLEAR_VARS)
43+
44+
LOCAL_SRC_FILES := $(common_src_files)
45+
46+
LOCAL_CFLAGS += $(device_sqlite_flags)
47+
48+
LOCAL_SHARED_LIBRARIES := libdl
49+
50+
LOCAL_MODULE:= libsqlite3_xamarin
51+
52+
LOCAL_C_INCLUDES += $(call include-path-for, system-core)/cutils
53+
54+
LOCAL_SHARED_LIBRARIES += liblog
55+
56+
# include android specific methods
57+
#LOCAL_WHOLE_STATIC_LIBRARIES := libsqlite3_xamarin
58+
59+
include $(BUILD_SHARED_LIBRARY)
60+
61+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64

0 commit comments

Comments
 (0)