Load main library as soon as possible
Delaying the main library load cause serious problems for people who want to access it's functions from java before the main method is called. Change-Id: I87f3a8282003395e003b06978048762eeabe6548 Fixes: QTBUG-68813 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
This commit is contained in:
parent
8796e3016f
commit
3c74042c3d
@ -606,11 +606,14 @@ public class QtActivityDelegate
|
||||
}
|
||||
QtNative.loadQtLibraries(loaderParams.getStringArrayList(NATIVE_LIBRARIES_KEY));
|
||||
ArrayList<String> libraries = loaderParams.getStringArrayList(BUNDLED_LIBRARIES_KEY);
|
||||
QtNative.loadBundledLibraries(libraries, QtNativeLibrariesDir.nativeLibrariesDir(m_activity));
|
||||
String nativeLibsDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity);
|
||||
QtNative.loadBundledLibraries(libraries, nativeLibsDir);
|
||||
m_mainLib = loaderParams.getString(MAIN_LIBRARY_KEY);
|
||||
// older apps provide the main library as the last bundled library; look for this if the main library isn't provided
|
||||
if (null == m_mainLib && libraries.size() > 0)
|
||||
if (null == m_mainLib && libraries.size() > 0) {
|
||||
m_mainLib = libraries.get(libraries.size() - 1);
|
||||
libraries.remove(libraries.size() - 1);
|
||||
}
|
||||
|
||||
if (loaderParams.containsKey(EXTRACT_STYLE_KEY)) {
|
||||
String path = loaderParams.getString(EXTRACT_STYLE_KEY);
|
||||
@ -664,8 +667,8 @@ public class QtActivityDelegate
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return true;
|
||||
m_mainLib = QtNative.loadMainLibrary(m_mainLib, nativeLibsDir);
|
||||
return m_mainLib != null;
|
||||
}
|
||||
|
||||
public boolean startApplication()
|
||||
@ -728,11 +731,7 @@ public class QtActivityDelegate
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
String nativeLibraryDir = QtNativeLibrariesDir.nativeLibrariesDir(m_activity);
|
||||
QtNative.startApplication(m_applicationParameters,
|
||||
m_environmentVariables,
|
||||
m_mainLib,
|
||||
nativeLibraryDir);
|
||||
QtNative.startApplication(m_applicationParameters, m_environmentVariables, m_mainLib);
|
||||
m_started = true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
@ -231,6 +231,41 @@ public class QtNative
|
||||
});
|
||||
}
|
||||
|
||||
public static String loadMainLibrary(final String mainLibrary, final String nativeLibraryDir)
|
||||
{
|
||||
final String[] res = new String[1];
|
||||
res[0] = null;
|
||||
m_qtThread.run(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
String mainLibNameTemplate = "lib" + mainLibrary + ".so";
|
||||
File f = new File(nativeLibraryDir + mainLibNameTemplate);
|
||||
if (!f.exists()) {
|
||||
try {
|
||||
ActivityInfo info = m_activity.getPackageManager().getActivityInfo(m_activity.getComponentName(),
|
||||
PackageManager.GET_META_DATA);
|
||||
String systemLibraryDir = QtNativeLibrariesDir.systemLibrariesDir;
|
||||
if (info.metaData.containsKey("android.app.system_libs_prefix"))
|
||||
systemLibraryDir = info.metaData.getString("android.app.system_libs_prefix");
|
||||
f = new File(systemLibraryDir + mainLibNameTemplate);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!f.exists())
|
||||
return;
|
||||
System.load(f.getAbsolutePath());
|
||||
res[0] = f.getAbsolutePath();
|
||||
} catch (Exception e) {
|
||||
Log.e(QtTAG, "Can't load '" + mainLibrary + "'", e);
|
||||
}
|
||||
}
|
||||
});
|
||||
return res[0];
|
||||
}
|
||||
|
||||
public static void setActivity(Activity qtMainActivity, QtActivityDelegate qtActivityDelegate)
|
||||
{
|
||||
synchronized (m_mainActivityMutex) {
|
||||
@ -308,46 +343,20 @@ public class QtNative
|
||||
});
|
||||
}
|
||||
|
||||
public static boolean startApplication(String params,
|
||||
final String environment,
|
||||
String mainLibrary,
|
||||
String nativeLibraryDir) throws Exception
|
||||
public static boolean startApplication(String params, final String environment, String mainLib) throws Exception
|
||||
{
|
||||
String mainLibNameTemplate = "lib" + mainLibrary + ".so";
|
||||
File f = new File(nativeLibraryDir + mainLibNameTemplate);
|
||||
if (!f.exists()) {
|
||||
try {
|
||||
ActivityInfo info = m_activity.getPackageManager().getActivityInfo(m_activity.getComponentName(),
|
||||
PackageManager.GET_META_DATA);
|
||||
String systemLibraryDir = QtNativeLibrariesDir.systemLibrariesDir;
|
||||
if (info.metaData.containsKey("android.app.system_libs_prefix"))
|
||||
systemLibraryDir = info.metaData.getString("android.app.system_libs_prefix");
|
||||
f = new File(systemLibraryDir + mainLibNameTemplate);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
if (!f.exists())
|
||||
throw new Exception("Can't find main library '" + mainLibrary + "'");
|
||||
|
||||
if (params == null)
|
||||
params = "-platform\tandroid";
|
||||
|
||||
final String mainLibraryPath = f.getAbsolutePath();
|
||||
final boolean[] res = new boolean[1];
|
||||
res[0] = false;
|
||||
synchronized (m_mainActivityMutex) {
|
||||
if (params.length() > 0 && !params.startsWith("\t"))
|
||||
params = "\t" + params;
|
||||
final String qtParams = f.getAbsolutePath() + params;
|
||||
final String qtParams = mainLib + params;
|
||||
m_qtThread.run(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
System.load(mainLibraryPath);
|
||||
} catch (Exception e) {
|
||||
Log.i(QtTAG, "Can't load '" + mainLibraryPath + "'", e);
|
||||
}
|
||||
res[0] = startQtAndroidPlugin(qtParams, environment);
|
||||
setDisplayMetrics(m_displayMetricsScreenWidthPixels,
|
||||
m_displayMetricsScreenHeightPixels,
|
||||
|
@ -98,8 +98,8 @@ public class QtServiceDelegate
|
||||
private static final String APP_DISPLAY_METRIC_SCREEN_YDPI_KEY = "display.screen.dpi.y";
|
||||
private static final String APP_DISPLAY_METRIC_SCREEN_DENSITY_KEY = "display.screen.density";
|
||||
|
||||
private String m_mainLib = null;
|
||||
private Service m_service = null;
|
||||
private String m_mainLib;
|
||||
private static String m_environmentVariables = null;
|
||||
private static String m_applicationParameters = null;
|
||||
|
||||
@ -142,9 +142,9 @@ public class QtServiceDelegate
|
||||
}
|
||||
QtNative.loadQtLibraries(loaderParams.getStringArrayList(NATIVE_LIBRARIES_KEY));
|
||||
ArrayList<String> libraries = loaderParams.getStringArrayList(BUNDLED_LIBRARIES_KEY);
|
||||
QtNative.loadBundledLibraries(libraries, QtNativeLibrariesDir.nativeLibrariesDir(m_service));
|
||||
String nativeLibsDir = QtNativeLibrariesDir.nativeLibrariesDir(m_service);
|
||||
QtNative.loadBundledLibraries(libraries, nativeLibsDir);
|
||||
m_mainLib = loaderParams.getString(MAIN_LIBRARY_KEY);
|
||||
|
||||
m_environmentVariables = loaderParams.getString(ENVIRONMENT_VARIABLES_KEY);
|
||||
String additionalEnvironmentVariables = "QT_ANDROID_FONTS_MONOSPACE=Droid Sans Mono;Droid Sans;Droid Sans Fallback"
|
||||
+ "\tQT_ANDROID_FONTS_SERIF=Droid Serif"
|
||||
@ -165,7 +165,8 @@ public class QtServiceDelegate
|
||||
else
|
||||
m_applicationParameters = "";
|
||||
|
||||
return true;
|
||||
m_mainLib = QtNative.loadMainLibrary(m_mainLib, nativeLibsDir);
|
||||
return m_mainLib != null;
|
||||
}
|
||||
|
||||
public boolean startApplication()
|
||||
@ -173,10 +174,7 @@ public class QtServiceDelegate
|
||||
// start application
|
||||
try {
|
||||
String nativeLibraryDir = QtNativeLibrariesDir.nativeLibrariesDir(m_service);
|
||||
QtNative.startApplication(m_applicationParameters,
|
||||
m_environmentVariables,
|
||||
m_mainLib,
|
||||
nativeLibraryDir);
|
||||
QtNative.startApplication(m_applicationParameters, m_environmentVariables, m_mainLib);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
Loading…
x
Reference in New Issue
Block a user