Skip to content

Commit 9d2e2b2

Browse files
authored
Merge pull request #67 from polymonster/android-dev
Android support
2 parents 82f3a35 + 52cd3b6 commit 9d2e2b2

50 files changed

Lines changed: 14166 additions & 283 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.ci/android.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/usr/bin/env bash
2+
cd examples
3+
../pmbuild android -libs
4+
../pmbuild android
5+
cd build/android
6+
gradle wrapper
7+
./gradlew assembleRelease

.github/workflows/build.yaml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ jobs:
8888
runs-on: ubuntu-latest
8989
steps:
9090
- uses: actions/checkout@v3
91-
with:
91+
with:
9292
submodules: "recursive"
9393
lfs: true
9494
- run: |
@@ -98,3 +98,23 @@ jobs:
9898
../pmbuild linux-editor -libs
9999
../pmbuild linux-editor
100100
../pmbuild make linux-editor all
101+
android:
102+
runs-on: ubuntu-latest
103+
steps:
104+
- uses: actions/checkout@v3
105+
with:
106+
submodules: "recursive"
107+
lfs: true
108+
- uses: actions/setup-java@v4
109+
with:
110+
distribution: "temurin"
111+
java-version: "21"
112+
- uses: gradle/actions/setup-gradle@v3
113+
with:
114+
gradle-version: 8.14.3
115+
- run: |
116+
cd examples
117+
../pmbuild android
118+
cd build/android
119+
gradle wrapper
120+
./gradlew assembleRelease

core/pen/include/console.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ inline void output_debug(const c8* format, ...)
6363
#else
6464
#define PEN_SYSTEM system
6565
#endif
66+
#ifdef PEN_PLATFORM_ANDROID
67+
#include <android/log.h>
68+
#define PEN_LOG(F, ...) __android_log_print(ANDROID_LOG_DEBUG, "PMTECH", F, ## __VA_ARGS__)
69+
#else
6670
#define PEN_LOG output_debug
71+
#endif
6772
#define PEN_LOG_VA(fmt, va) output_debug_va(fmt, va)
6873
#define PEN_ASSERT assert
6974
#define PEN_ASSERT_MSG(A, M) \

core/pen/include/file_system.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ namespace pen
2828

2929
bool filesystem_file_exists(const c8* filename);
3030
pen_error filesystem_read_file_to_buffer(const c8* filename, void** p_buffer, u32& buffer_size);
31+
pen_error filesystem_read_file_to_buffer_direct(const c8* filename, void** p_buffer, u32& buffer_size);
3132
pen_error filesystem_getmtime(const c8* filename, u32& mtime_out);
3233
size_t filesystem_getsize(const c8* filename);
3334
void filesystem_toggle_hidden_files();

core/pen/include/os.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ namespace pen
5757
bool os_is_backgrounded();
5858
void os_register_background_callback(void (*callback)(bool));
5959
bool os_require_audio_reinit(bool reset);
60+
Str os_get_clipboard_string();
61+
void os_clear_clipboard_string();
62+
void os_enable_paste_popup(bool enable);
63+
bool os_tapped();
6064

6165
// music
6266
struct music_item

core/pen/project.lua

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ local function setup_win32()
44
{
55
"$(VK_SDK_PATH)/Include"
66
}
7-
elseif renderer_dir == "opengl" then
7+
elseif renderer_dir == "opengl" then
88
includedirs
99
{
1010
"../../third_party/glew/include",
@@ -16,31 +16,31 @@ local function setup_win32()
1616
end
1717

1818
local function setup_ios()
19-
files
20-
{
19+
files
20+
{
2121
"source/posix/**.cpp",
2222
"source/mach/**.cpp"
2323
}
2424
end
2525

2626
local function setup_osx()
27-
files
28-
{
27+
files
28+
{
2929
"source/posix/**.cpp",
3030
"source/mach/**.cpp"
3131
}
3232
end
3333

3434
local function setup_linux()
35-
files
36-
{
35+
files
36+
{
3737
"source/posix/**.cpp"
3838
}
3939
end
4040

4141
local function setup_web()
42-
files
43-
{
42+
files
43+
{
4444
"source/posix/**.cpp",
4545
"source/linux/timer.cpp",
4646
"source/single_threaded/**.cpp"
@@ -52,9 +52,12 @@ local function setup_web()
5252
end
5353

5454
local function setup_android()
55-
files
56-
{
57-
"source/posix/**.cpp"
55+
files
56+
{
57+
"source/posix/pen_string.cpp",
58+
"source/posix/threads.cpp",
59+
60+
"source/linux/timer.cpp",
5861
}
5962
end
6063

@@ -74,58 +77,58 @@ local function setup_platform()
7477
end
7578
end
7679

77-
-- Project
80+
-- Project
7881
project "pen"
7982
setup_env()
8083
setup_platform_defines()
81-
setup_platform()
82-
location ("build/" .. platform_dir)
84+
setup_platform()
8385
kind "StaticLib"
86+
location ("build/" .. platform_dir)
8487
language "C++"
85-
86-
files
88+
89+
files
8790
{
8891
"include/*.h",
8992
"source/*.cpp",
90-
91-
"include/" .. platform_dir .. "/**.h",
93+
94+
"include/" .. platform_dir .. "/**.h",
9295

9396
"source/" .. platform_dir .. "/**.cpp",
9497
"source/" .. platform_dir .. "/**.mm",
95-
96-
"../../third_party/str/*.cpp",
98+
99+
"../../third_party/str/*.cpp",
97100
}
98-
99-
includedirs
101+
102+
includedirs
100103
{
101104
"include",
102-
"include/" .. platform_dir,
103-
104-
"../../third_party",
105+
"include/" .. platform_dir,
106+
107+
"../../third_party",
105108
"../../third_party/libstem_gamepad/source"
106109
}
107-
110+
108111
-- rendere selection, and allow for no renderer
109112
if string.len(renderer_dir) > 0 then
110113
files
111-
{
114+
{
112115
"include/" .. renderer_dir .. "/**.h",
113116
"source/" .. renderer_dir .. "/**.cpp",
114117
"source/" .. renderer_dir .. "/**.mm",
115118
}
116-
includedirs
119+
includedirs
117120
{
118121
"include/" .. renderer_dir,
119122
}
120123
end
121-
124+
122125
filter "configurations:Release"
123126
defines { "NDEBUG" }
124127
entrypoint "WinMainCRTStartup"
125128
optimize "Speed"
126129
targetdir ("lib/" .. platform_dir .. "/release")
127130
targetname "pen"
128-
131+
129132
filter "configurations:Debug"
130133
defines { "DEBUG" }
131134
entrypoint "WinMainCRTStartup"
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
// file_system.cpp
2+
// Copyright 2014 - 2025 Alex Dixon.
3+
// License: https://github.com/polymonster/pmtech/blob/master/license.md
4+
5+
#include "file_system.h"
6+
#include "memory.h"
7+
#include "os.h"
8+
#include "pen.h"
9+
#include "pen_string.h"
10+
11+
#include <sys/stat.h>
12+
#include <dirent.h>
13+
14+
namespace pen
15+
{
16+
pen_error filesystem_enum_volumes(fs_tree_node& results)
17+
{
18+
// stub
19+
return PEN_ERR_OK;
20+
}
21+
22+
void filesystem_toggle_hidden_files()
23+
{
24+
// stub
25+
}
26+
27+
bool match_file(struct dirent* ent, s32 num_wildcards, va_list wildcards)
28+
{
29+
return false;
30+
}
31+
32+
pen_error filesystem_enum_directory(const c8* directory, fs_tree_node& results, s32 num_wildcards, ...)
33+
{
34+
va_list wc;
35+
va_start(wc, num_wildcards);
36+
37+
pen_error res = filesystem_enum_directory(directory, results, num_wildcards, wc);
38+
39+
va_end(wc);
40+
41+
return res;
42+
}
43+
44+
pen_error filesystem_enum_directory(const c8* directory, fs_tree_node& results, s32 num_wildcards, va_list wildcards)
45+
{
46+
DIR* dir;
47+
struct dirent* ent;
48+
49+
u32 num_items = 0;
50+
if ((dir = opendir(directory)) != nullptr)
51+
{
52+
while ((ent = readdir(dir)) != nullptr)
53+
{
54+
if (match_file(ent, num_wildcards, wildcards))
55+
{
56+
num_items++;
57+
}
58+
}
59+
60+
closedir(dir);
61+
}
62+
63+
if (num_items == 0)
64+
{
65+
return PEN_ERR_FILE_NOT_FOUND;
66+
}
67+
68+
if (results.children == nullptr)
69+
{
70+
// alloc new mem
71+
results.children = (fs_tree_node*)pen::memory_alloc(sizeof(fs_tree_node) * num_items);
72+
pen::memory_zero(results.children, sizeof(fs_tree_node) * num_items);
73+
}
74+
else
75+
{
76+
// grow buffer
77+
if (results.num_children < num_items)
78+
{
79+
results.children = (fs_tree_node*)pen::memory_realloc(results.children, sizeof(fs_tree_node) * num_items);
80+
}
81+
}
82+
83+
results.num_children = num_items;
84+
85+
u32 i = 0;
86+
if ((dir = opendir(directory)) != nullptr)
87+
{
88+
while ((ent = readdir(dir)) != nullptr)
89+
{
90+
if (match_file(ent, num_wildcards, wildcards))
91+
{
92+
if (results.children[i].name == nullptr)
93+
{
94+
// allocate 1024 file buffer
95+
results.children[i].name = (c8*)pen::memory_alloc(1024);
96+
pen::memory_zero(results.children[i].name, 1024);
97+
}
98+
99+
u32 len = pen::string_length(ent->d_name);
100+
len = min<u32>(len, 1022);
101+
102+
memcpy(results.children[i].name, ent->d_name, len);
103+
results.children[i].name[len] = '\0';
104+
105+
results.children[i].num_children = 0;
106+
107+
++i;
108+
}
109+
}
110+
111+
closedir(dir);
112+
}
113+
114+
return PEN_ERR_OK;
115+
}
116+
117+
pen_error filesystem_enum_free_mem(fs_tree_node& tree)
118+
{
119+
for (s32 i = 0; i < tree.num_children; ++i)
120+
{
121+
filesystem_enum_free_mem(tree.children[i]);
122+
}
123+
124+
pen::memory_free(tree.children);
125+
pen::memory_free(tree.name);
126+
127+
return PEN_ERR_OK;
128+
}
129+
130+
pen_error filesystem_getmtime(const c8* filename, u32& mtime_out)
131+
{
132+
struct stat st;
133+
if (stat(filename, &st) == 0) {
134+
mtime_out = (u32)st.st_mtime; // modification time
135+
return PEN_ERR_OK;
136+
}
137+
138+
return PEN_ERR_FILE_NOT_FOUND;
139+
}
140+
141+
const c8** filesystem_get_user_directory(s32& directory_depth)
142+
{
143+
return nullptr;
144+
}
145+
146+
s32 filesystem_exclude_slash_depth()
147+
{
148+
// directory depth 0 can be a slash
149+
return 0;
150+
}
151+
} // namespace pen

0 commit comments

Comments
 (0)