main-executable: when ANDROID_ROOT is not set, load art core libs from @libdir@/java/dex/art

This commit is contained in:
Mis012 2022-10-09 23:08:20 +02:00
parent 449090143e
commit 31cf1a521b

View file

@ -11,6 +11,10 @@
// generated by meson
#include "config.h"
// TODO: arguably we shouldn't rely on our install prefix being the same as art's install prefix
// maybe we can have art export a function returning it's install prefix for us
#define INSTALL_DEXDIR INSTALL_LIBDIR "/java/dex/"
GtkWidget *window;
// standard Gtk Application stuff, more or less
@ -49,14 +53,21 @@ char *construct_classpath(char *prefix, char *path_to_prepend, char **cp_array,
char *construct_boot_classpath(char *prefix, char **cp_array, size_t len)
{
char *android_root_path = getenv("ANDROID_ROOT");
char *framework_dir = "/framework/";
char *framework_dir_path = malloc(strlen(android_root_path) + strlen(framework_dir) + 1);
strcpy(framework_dir_path, android_root_path);
strcat(framework_dir_path, framework_dir);
char *framework_dir_path;
const char *android_root_path = getenv("ANDROID_ROOT");
if(!android_root_path) { // look in PREFIX by default
framework_dir_path = INSTALL_DEXDIR "/art/";
}
else { // if ANDROID_ROOT is set, look there
const char *framework_dir = "/framework/";
framework_dir_path = malloc(strlen(android_root_path) + strlen(framework_dir) + 1);
strcpy(framework_dir_path, android_root_path);
strcat(framework_dir_path, framework_dir);
}
char *result = construct_classpath(prefix, framework_dir_path, cp_array, len);
free(framework_dir_path);
if(android_root_path) // otherwise it's not allocated dynamically
free(framework_dir_path);
return result;
}
@ -74,10 +85,7 @@ JNIEnv* create_vm(char *api_impl_jar, char *apk_classpath, char *microg_apk) {
"apache-xml-hostdex.jar",
"core-junit-hostdex.jar",
"core-libart-hostdex.jar",
"dex-host.jar",
"dx.jar",
"hamcrest-hostdex.jar",
"jarjar.jar",
};
options[0].optionString = construct_boot_classpath("-Xbootclasspath:", boot_cp_arr, ARRAY_SIZE(boot_cp_arr));
@ -107,10 +115,10 @@ JNIEnv* create_vm(char *api_impl_jar, char *apk_classpath, char *microg_apk) {
// which we use to inject our JNI library into the correct classloader without having to load it from java code
bool HAXX__JavaVMExt__LoadNativeLibrary(JNIEnv* env, char *path, jobject class_loader, char** error_msg);
#define API_IMPL_JAR_PATH_LIBDIR INSTALL_LIBDIR "/java/dex/api-impl.jar"
#define API_IMPL_JAR_PATH_LIBDIR INSTALL_DEXDIR "/translation-layer/api-impl.jar"
#define API_IMPL_JAR_PATH_LOCAL "./api-impl.jar"
#define MICROG_APK_PATH_LIBDIR INSTALL_LIBDIR "/java/dex/com.google.android.gms.apk"
#define MICROG_APK_PATH_LIBDIR INSTALL_DEXDIR "/microg/com.google.android.gms.apk"
#define MICROG_APK_PATH_LOCAL "./com.google.android.gms.apk"
struct jni_callback_data { char *apk_main_activity_class; uint32_t window_width; uint32_t window_height;};
@ -137,6 +145,7 @@ static void open(GtkApplication *app, GFile** files, gint nfiles, const gchar* h
}
struct stat dont_care;
// check for api-impl.jar and com.google.android.gms.apk in './' first (for running from builddir), and in system install path second
ret = stat(API_IMPL_JAR_PATH_LOCAL, &dont_care);
errno_localdir = errno;
if(!ret) {