Skip to content

Commit 93b5b3e

Browse files
committed
[[ Bug 19346 ]] Reinstate call to System.loadLibrary for android external
Calling `System.loadLibrary` loads the library and calls `JNI_OnLoad`, which externals need to be able to execute LC API calls on an auxiliary thread on android (as they need the pointer to the java virtual machine). This patch reinstates that call for externals until we can work out a satisfactory way to do this from libfoundation.
1 parent e697694 commit 93b5b3e

1 file changed

Lines changed: 39 additions & 1 deletion

File tree

engine/src/dispatch.cpp

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2097,11 +2097,49 @@ void MCDispatch::timer(MCNameRef p_message, MCParameter *p_parameters)
20972097

20982098
bool MCDispatch::loadexternal(MCStringRef p_external)
20992099
{
2100+
MCStringRef t_filename;
2101+
#if defined(TARGET_SUBPLATFORM_ANDROID)
2102+
extern bool revandroid_loadExternalLibrary(MCStringRef p_external, MCStringRef &r_filename);
2103+
// MW-2013-08-07: [[ ExternalsApiV5 ]] Make sure we only use the leaf name
2104+
// of the external when loading.
2105+
uindex_t t_slash_index;
2106+
uindex_t t_ext_length = MCStringGetLength(p_external);
2107+
MCStringRef t_external_leaf;
2108+
2109+
if (MCStringLastIndexOfChar(p_external, '/', t_ext_length, kMCStringOptionCompareExact, t_slash_index))
2110+
{
2111+
if (!MCStringCopySubstring(p_external, MCRangeMake(t_slash_index + 1, t_ext_length - t_slash_index - 1), t_external_leaf))
2112+
return false;
2113+
}
2114+
else
2115+
t_external_leaf = MCValueRetain(p_external);
2116+
2117+
if (!revandroid_loadExternalLibrary(t_external_leaf, t_filename))
2118+
{
2119+
MCValueRelease(t_external_leaf);
2120+
return false;
2121+
}
2122+
2123+
// Don't try and load any drivers as externals.
2124+
if (MCStringBeginsWithCString(t_external_leaf, (const char_t *)"db", kMCStringOptionCompareExact))
2125+
{
2126+
MCValueRelease(t_external_leaf);
2127+
MCValueRelease(t_filename);
2128+
return true;
2129+
}
2130+
2131+
MCValueRelease(t_external_leaf);
2132+
#else
2133+
// AL-2015-02-10: [[ SB Inclusions ]] New module loading utility deals with path resolution
2134+
t_filename = MCValueRetain(p_external);
2135+
#endif
2136+
21002137
if (m_externals == nil)
21012138
m_externals = new (nothrow) MCExternalHandlerList;
21022139

21032140
bool t_loaded;
2104-
t_loaded = m_externals -> Load(p_external);
2141+
t_loaded = m_externals -> Load(t_filename);
2142+
MCValueRelease(t_filename);
21052143

21062144
if (m_externals -> IsEmpty())
21072145
{

0 commit comments

Comments
 (0)