Skip to content

Commit 8267ac7

Browse files
committed
* ios_setup.m
1 parent 343e89a commit 8267ac7

8 files changed

Lines changed: 215 additions & 188 deletions

File tree

ScriptEngine/ScriptEngine.vcxproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,12 +184,17 @@
184184
<ClCompile Include="main\glib.c" />
185185
<ClCompile Include="custom\icall_binding.c" />
186186
<ClCompile Include="main\il2cpp_support.c" />
187-
<ClCompile Include="main\main.c" />
187+
<ClCompile Include="main\ios\aot_module_register.c" />
188188
<ClCompile Include="main\runtime.c" />
189189
<ClCompile Include="ScriptEngine.c" />
190190
<ClCompile Include="main\Mediator.cpp" />
191191
<ClCompile Include="custom\wrapper.c" />
192192
</ItemGroup>
193+
<ItemGroup>
194+
<None Include="main\ios\ios_setup.m">
195+
<FileType>CppCode</FileType>
196+
</None>
197+
</ItemGroup>
193198
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
194199
<ImportGroup Label="ExtensionTargets">
195200
</ImportGroup>

ScriptEngine/ScriptEngine.vcxproj.filters

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@
3838
</ClInclude>
3939
</ItemGroup>
4040
<ItemGroup>
41-
<ClCompile Include="main\main.c">
42-
<Filter>源文件</Filter>
43-
</ClCompile>
4441
<ClCompile Include="main\runtime.c">
4542
<Filter>源文件</Filter>
4643
</ClCompile>
@@ -74,5 +71,11 @@
7471
<ClCompile Include="main\Mediator.cpp">
7572
<Filter>源文件</Filter>
7673
</ClCompile>
74+
<ClCompile Include="main\ios\aot_module_register.c">
75+
<Filter>源文件</Filter>
76+
</ClCompile>
77+
</ItemGroup>
78+
<ItemGroup>
79+
<None Include="main\ios\ios_setup.m" />
7780
</ItemGroup>
7881
</Project>

ScriptEngine/custom/icall_binding.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ MonoString* UnityEngine_Application_get_persistentDataPath()
291291

292292
void init_event();
293293
void regist_icall_gen();
294-
void mono_ios_register_icall(void)
294+
void mono_register_icall(void)
295295
{
296296
init_il2cpp();
297297
init_wrapper();
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "../runtime.h"
2+
#if RUNTIME_IOS
3+
extern void mono_aot_register_module(char *name);
4+
5+
extern void *mono_aot_module_mscorlib_info;
6+
7+
void mono_ios_register_modules(void)
8+
{
9+
mono_aot_register_module(mono_aot_module_mscorlib_info);
10+
}
11+
#endif

ScriptEngine/main/ios/ios_setup.m

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
2+
#include "../runtime.h"
3+
#if RUNTIME_IOS
4+
#import <Foundation/Foundation.h>
5+
#import <os/log.h>
6+
7+
#include <sys/stat.h>
8+
#include <sys/mman.h>
9+
10+
11+
#define PRINT(...) do { printf (__VA_ARGS__); } while (0);
12+
13+
static print_log print_log_callback;
14+
15+
/* These are not in public headers */
16+
typedef unsigned char* (*MonoLoadAotDataFunc) (MonoAssembly *assembly, int size, void *user_data, void **out_handle);
17+
typedef void (*MonoFreeAotDataFunc) (MonoAssembly *assembly, int size, void *user_data, void *handle);
18+
void mono_install_load_aot_data_hook (MonoLoadAotDataFunc load_func, MonoFreeAotDataFunc free_func, void *user_data);
19+
20+
typedef enum {
21+
MONO_AOT_MODE_NONE,
22+
MONO_AOT_MODE_NORMAL,
23+
MONO_AOT_MODE_HYBRID,
24+
MONO_AOT_MODE_FULL,
25+
MONO_AOT_MODE_LLVMONLY,
26+
MONO_AOT_MODE_INTERP,
27+
MONO_AOT_MODE_INTERP_LLVMONLY
28+
} MonoAotMode;
29+
30+
void mono_jit_set_aot_mode (MonoAotMode mode);
31+
32+
extern void mono_ee_interp_init (const char *);
33+
extern void mono_icall_table_init (void);
34+
extern void mono_marshal_ilgen_init (void);
35+
extern void mono_method_builder_ilgen_init (void);
36+
extern void mono_sgen_mono_ilgen_init (void);
37+
38+
const char * runtime_bundle_path(void);
39+
40+
void mono_ios_setup_execution_mode (void)
41+
{
42+
mono_icall_table_init ();
43+
mono_marshal_ilgen_init ();
44+
mono_method_builder_ilgen_init ();
45+
mono_sgen_mono_ilgen_init ();
46+
mono_ee_interp_init (0);
47+
mono_jit_set_aot_mode (MONO_AOT_MODE_INTERP);
48+
}
49+
50+
void set_log_callback(print_log callback)
51+
{
52+
print_log_callback = callback;
53+
}
54+
55+
static unsigned char *
56+
load_aot_data (MonoAssembly *assembly, int size, void *user_data, void **out_handle)
57+
{
58+
*out_handle = NULL;
59+
60+
char path [1024];
61+
int res;
62+
63+
MonoAssemblyName *assembly_name = mono_assembly_get_name (assembly);
64+
const char *aname = mono_assembly_name_get_name (assembly_name);
65+
const char *bundle = runtime_bundle_path ();
66+
67+
// LOG (PRODUCT ": Looking for aot data for assembly '%s'.", name);
68+
res = snprintf (path, sizeof (path) - 1, "%s/%s.aotdata", bundle, aname);
69+
assert (res > 0);
70+
71+
int fd = open (path, O_RDONLY);
72+
if (fd < 0) {
73+
//LOG (PRODUCT ": Could not load the aot data for %s from %s: %s\n", aname, path, strerror (errno));
74+
return NULL;
75+
}
76+
77+
void *ptr = mmap (NULL, size, PROT_READ, MAP_FILE | MAP_PRIVATE, fd, 0);
78+
if (ptr == MAP_FAILED) {
79+
//LOG (PRODUCT ": Could not map the aot file for %s: %s\n", aname, strerror (errno));
80+
close (fd);
81+
return NULL;
82+
}
83+
84+
close (fd);
85+
86+
//LOG (PRODUCT ": Loaded aot data for %s.\n", name);
87+
88+
*out_handle = ptr;
89+
90+
return (unsigned char *) ptr;
91+
}
92+
93+
static void
94+
free_aot_data (MonoAssembly *assembly, int size, void *user_data, void *handle)
95+
{
96+
munmap (handle, size);
97+
}
98+
99+
void
100+
log_callback (const char *log_domain, const char *log_level, const char *message, mono_bool fatal, void *user_data)
101+
{
102+
NSLog (@"(%s %s) %s", log_domain, log_level, message);
103+
if (fatal) {
104+
exit (1);
105+
}
106+
}
107+
108+
static void
109+
register_dllmap (void)
110+
{
111+
mono_dllmap_insert (NULL, "System.Native", NULL, "__Internal", NULL);
112+
mono_dllmap_insert (NULL, "System.Security.Cryptography.Native.Apple", NULL, "__Internal", NULL);
113+
}
114+
115+
/* Implemented by generated code */
116+
void mono_ios_register_modules (void);
117+
118+
void
119+
mono_ios_runtime_init (void)
120+
{
121+
register_dllmap ();
122+
123+
#if TARGET_IPHONE_SIMULATOR//模拟器
124+
125+
#elif TARGET_OS_IPHONE//真机
126+
mono_ios_register_modules ();
127+
mono_ios_setup_execution_mode ();
128+
129+
#endif
130+
131+
mono_install_load_aot_data_hook (load_aot_data, free_aot_data, NULL);
132+
mono_trace_set_log_handler (log_callback, NULL);
133+
134+
//setenv ("MONO_LOG_LEVEL", "debug", TRUE);
135+
136+
//mono_jit_init_version ("Mono.ios", "mobile");
137+
}
138+
139+
char* doc_path = NULL;
140+
const char *
141+
get_documents_path(void)
142+
{
143+
if (doc_path)
144+
return doc_path;
145+
146+
#if RUNTIME_IOS
147+
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
148+
NSString *path = [paths objectAtIndex : 0];
149+
doc_path = strdup([path UTF8String]);
150+
#else
151+
if ((doc_path = _getcwd(NULL, 0)) == NULL)
152+
{
153+
perror("getcwd error");
154+
}
155+
else
156+
{
157+
printf("doc_path=%s\n", doc_path);
158+
}
159+
#endif
160+
return doc_path;
161+
}
162+
163+
//#endif

ScriptEngine/main/main.c

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)