Added Caciocavallo17; Get JRE build from Actions
This commit is contained in:
1 parent
d75f203bf3
commit
b7cc2d097e
14 files changed
+169
-174
No files matched your search
@@ -25,6 +25,28 @@ jobs:
|
||||
- name: Checkout repository submodules
|
||||
run: git submodule update --init --recursive
|
||||
|
||||
- name: Get JRE8
|
||||
uses: dawidd6/action-download-artifact@v2
|
||||
with:
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
workflow: build.yml
|
||||
path: depends
|
||||
workflow_conclusion: success
|
||||
repo: PojavLauncherTeam/android-openjdk-build-multiarch
|
||||
branch: jre8-ios-jitjailed
|
||||
name: jre8-ios-aarch64
|
||||
|
||||
- name: Get JRE17
|
||||
uses: dawidd6/action-download-artifact@v2
|
||||
with:
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
workflow: build.yml
|
||||
path: depends
|
||||
workflow_conclusion: success
|
||||
repo: PojavLauncherTeam/android-openjdk-build-multiarch
|
||||
branch: buildjre17
|
||||
name: jre17-ios-aarch64
|
||||
|
||||
- name: Build packages
|
||||
env:
|
||||
password: ${{ secrets.ELLIE_MINI_SECRET }}
|
||||
|
||||
@@ -25,6 +25,28 @@ jobs:
|
||||
- name: Checkout repository submodules
|
||||
run: git submodule update --init --recursive
|
||||
|
||||
- name: Get JRE8
|
||||
uses: dawidd6/action-download-artifact@v2
|
||||
with:
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
workflow: build.yml
|
||||
path: depends
|
||||
workflow_conclusion: success
|
||||
repo: PojavLauncherTeam/android-openjdk-build-multiarch
|
||||
branch: jre8-ios-jitjailed
|
||||
name: jre8-ios-aarch64
|
||||
|
||||
- name: Get JRE17
|
||||
uses: dawidd6/action-download-artifact@v2
|
||||
with:
|
||||
github_token: ${{secrets.GITHUB_TOKEN}}
|
||||
workflow: build.yml
|
||||
path: depends
|
||||
workflow_conclusion: success
|
||||
repo: PojavLauncherTeam/android-openjdk-build-multiarch
|
||||
branch: buildjre17
|
||||
name: jre17-ios-aarch64
|
||||
|
||||
- name: Build packages
|
||||
env:
|
||||
password: ${{ secrets.ELLIE_MINI_SECRET }}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -43,6 +43,10 @@ public class PojavLauncher {
|
||||
});
|
||||
|
||||
System.setProperty("cacio.managed.screensize", args[2]);
|
||||
try {
|
||||
// Try to initialize Caciocavallo17
|
||||
Class.forName("com.github.caciocavallosilano.cacio.ctc.CTCPreloadClassLoader");
|
||||
} catch (ClassNotFoundException e) {}
|
||||
|
||||
if (args[0].equals(".LaunchJAR")) {
|
||||
UIKit.callback_JavaGUIViewController_launchJarFile(args[1]);
|
||||
|
||||
@@ -3,7 +3,6 @@ package net.kdt.pojavlaunch.uikit;
|
||||
import java.io.*;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.jar.*;
|
||||
import net.java.openjdk.cacio.ctc.CTCScreen;
|
||||
import net.kdt.pojavlaunch.utils.MCOptionUtils;
|
||||
import net.kdt.pojavlaunch.*;
|
||||
import org.lwjgl.glfw.*;
|
||||
@@ -32,12 +31,19 @@ public class UIKit {
|
||||
public static void callback_JavaGUIViewController_launchJarFile(final String filepath) throws Throwable {
|
||||
// Thread for refreshing the AWT buffer
|
||||
new Thread(() -> {
|
||||
Method getCurrentScreenRGB;
|
||||
try {
|
||||
try {
|
||||
getCurrentScreenRGB = Class.forName("net.java.openjdk.cacio.ctc.CTCScreen").getMethod("getCurrentScreenRGB");
|
||||
} catch (ClassNotFoundException e) {
|
||||
getCurrentScreenRGB = Class.forName("com.github.caciocavallosilano.cacio.ctc.CTCScreen").getMethod("getCurrentScreenRGB");
|
||||
}
|
||||
|
||||
long lastTime = System.currentTimeMillis();
|
||||
while (true) {
|
||||
int[] pixelsArray = null;
|
||||
try{
|
||||
pixelsArray = CTCScreen.getCurrentScreenRGB();
|
||||
pixelsArray = (int[])getCurrentScreenRGB.invoke(null);
|
||||
} catch (NullPointerException e) {
|
||||
Thread.sleep(500);
|
||||
}
|
||||
@@ -51,7 +57,7 @@ public class UIKit {
|
||||
}
|
||||
lastTime = currentTime;
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}, "AWTFBRefreshThread").start();
|
||||
|
||||
@@ -325,18 +325,16 @@ ipa: dsym
|
||||
echo 'Building PojavLauncher $(VERSION) - IPA - Start'
|
||||
mkdir -p $(SOURCEDIR)/depends; \
|
||||
cd $(SOURCEDIR)/depends; \
|
||||
if [ ! -d "java-8-openjdk" ]; then \
|
||||
if [ ! -d "java-8-openjdk" ] && [ -n "$(ls ../jre8-*.tar.xz)" ]; then \
|
||||
mkdir java-8-openjdk && cd java-8-openjdk; \
|
||||
wget 'https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch/releases/download/jre8-40df388/jre8-arm64-20220811-release.tar.xz'; \
|
||||
tar xvf *.tar.xz; \
|
||||
rm *.tar.xz; \
|
||||
tar xvf ../jre8-*.tar.xz; \
|
||||
rm ../jre8-*.tar.xz; \
|
||||
fi; \
|
||||
cd ..; \
|
||||
if [ ! -d "java-17-openjdk" ]; then \
|
||||
cd ..; \
|
||||
if [ ! -d "java-17-openjdk" ] && [ -n "$(ls ../jre17-*.tar.xz)" ]; then \
|
||||
mkdir java-17-openjdk && cd java-17-openjdk; \
|
||||
wget 'https://github.com/PojavLauncherTeam/android-openjdk-build-multiarch/releases/download/jre17-ca01427/jre17-arm64-20220817-release.tar.xz'; \
|
||||
tar xvf *.tar.xz; \
|
||||
rm *.tar.xz; \
|
||||
tar xvf ../jre17-*.tar.xz; \
|
||||
rm ../jre17-*.tar.xz; \
|
||||
fi; \
|
||||
mkdir -p $(OUTPUTDIR); \
|
||||
cd $(OUTPUTDIR); \
|
||||
@@ -346,6 +344,8 @@ ipa: dsym
|
||||
cp -R $(POJAV_JRE8_DIR) $(OUTPUTDIR)/Payload/PojavLauncher.app/jvm/; \
|
||||
cp -R $(POJAV_JRE17_DIR) $(OUTPUTDIR)/Payload/PojavLauncher.app/jvm/; \
|
||||
rm -rf $(OUTPUTDIR)/Payload/PojavLauncher.app/jvm/*/{bin,include,jre,lib/{ct.sym,libjsig.dylib,src.zip,tools.jar}}; \
|
||||
cp $(OUTPUTDIR)/Payload/PojavLauncher.app/Frameworks/libawt_xawt.dylib $(OUTPUTDIR)/Payload/PojavLauncher.app/jvm/*/lib/; \
|
||||
rm $(OUTPUTDIR)/Payload/PojavLauncher.app/Frameworks/libawt_*.dylib; \
|
||||
ldid -S$(SOURCEDIR)/entitlements_ipa.xml $(OUTPUTDIR)/Payload/PojavLauncher.app/PojavLauncher; \
|
||||
rm -f $(OUTPUTDIR)/*.ipa; \
|
||||
cd $(OUTPUTDIR); \
|
||||
|
||||
@@ -20,7 +20,7 @@ include_directories(
|
||||
)
|
||||
|
||||
# For cacio support library
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -rpath @executable_path/jvm/java-8-openjdk/lib -rpath /usr/lib/jvm/java-8-openjdk/lib")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -rpath @loader_path -rpath @executable_path/jvm/java-8-openjdk/lib -rpath /usr/lib/jvm/java-8-openjdk/lib")
|
||||
|
||||
add_definitions(-DCONFIG_COMMIT="${CONFIG_COMMIT}")
|
||||
add_definitions(-DCONFIG_RELEASE=${CONFIG_RELEASE})
|
||||
|
||||
@@ -113,6 +113,10 @@ const void * _CGDataProviderGetBytePointerCallbackAWT(void *info) {
|
||||
- (void)surfaceOnClick:(UITapGestureRecognizer *)sender {
|
||||
if (method_ReceiveInput == NULL) {
|
||||
class_CTCAndroidInput = (*runtimeJNIEnvPtr)->FindClass(runtimeJNIEnvPtr, "net/java/openjdk/cacio/ctc/CTCAndroidInput");
|
||||
if ((*runtimeJNIEnvPtr)->ExceptionCheck(runtimeJNIEnvPtr) == JNI_TRUE) {
|
||||
(*runtimeJNIEnvPtr)->ExceptionClear(runtimeJNIEnvPtr);
|
||||
class_CTCAndroidInput = (*runtimeJNIEnvPtr)->FindClass(runtimeJNIEnvPtr, "com/github/caciocavallosilano/cacio/ctc/CTCAndroidInput");
|
||||
}
|
||||
assert(class_CTCAndroidInput != NULL);
|
||||
method_ReceiveInput = (*runtimeJNIEnvPtr)->GetStaticMethodID(runtimeJNIEnvPtr, class_CTCAndroidInput, "receiveData", "(IIIII)V");
|
||||
assert(method_ReceiveInput != NULL);
|
||||
|
||||
+61
-51
@@ -113,12 +113,7 @@ NSString* environmentFailsafes(int minVersion) {
|
||||
NSString *jre16Path = [NSString stringWithFormat:@"%@/java-16-openjdk", jvmPath];
|
||||
NSString *jre17Path = [NSString stringWithFormat:@"%@/java-17-openjdk", jvmPath];
|
||||
|
||||
BOOL foundJava8 = [fm fileExistsAtPath:jre8Path];
|
||||
if (!foundJava8) {
|
||||
regLog("[JavaLauncher] Java 8 wasn't found on your device. Install Java 8 for more compatibility and the mod installer.");
|
||||
}
|
||||
|
||||
if (foundJava8 && minVersion <= 8) {
|
||||
if ([fm fileExistsAtPath:jre8Path] && minVersion <= 8) {
|
||||
javaHome = jre8Path;
|
||||
} else if ([fm fileExistsAtPath:jre16Path] && minVersion <= 16) {
|
||||
javaHome = jre16Path;
|
||||
@@ -143,7 +138,7 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi
|
||||
NSString *javaHome_pre = getPreference(@"java_home");
|
||||
|
||||
// We handle unset JAVA_HOME right there
|
||||
if (username == nil || getSelectedJavaVersion() < minVersion) {
|
||||
if (getSelectedJavaVersion() < minVersion) {
|
||||
NSLog(@"[JavaLauncher] Attempting to change to Java %d (actual might be higher)", minVersion);
|
||||
javaHome_pre = environmentFailsafes(minVersion);
|
||||
NSLog(@"[JavaLauncher] JAVA_HOME is now set to %@", javaHome_pre);
|
||||
@@ -182,30 +177,9 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi
|
||||
|
||||
allocmem_pre = [getPreference(@"allocated_memory") stringValue];
|
||||
allocmem = [allocmem_pre cStringUsingEncoding:NSUTF8StringEncoding];
|
||||
|
||||
char classpath[10000];
|
||||
|
||||
// "/Applications/PojavLauncher.app/libs/launcher.jar:/Applications/PojavLauncher.app/libs/ExagearApacheCommons.jar:/Applications/PojavLauncher.app/libs/gson-2.8.6.jar:/Applications/PojavLauncher.app/libs/jsr305.jar:/Applications/PojavLauncher.app/libs/lwjgl3-minecraft.jar";
|
||||
|
||||
// Generate classpath
|
||||
DIR *d;
|
||||
struct dirent *dir;
|
||||
d = opendir(java_libs_path);
|
||||
int cplen = -2;
|
||||
if (d) {
|
||||
// cplen += sprintf(classpath + cplen, "-Xbootclasspath/a:");
|
||||
while ((dir = readdir(d)) != NULL) {
|
||||
if (cplen < 0) {
|
||||
++cplen;
|
||||
continue;
|
||||
}
|
||||
cplen += sprintf(classpath + cplen, "%s/%s:", java_libs_path, dir->d_name);
|
||||
}
|
||||
classpath[cplen-1] = '\0';
|
||||
closedir(d);
|
||||
}
|
||||
debugLog("[JavaLauncher] Classpath generated: %s", classpath);
|
||||
|
||||
// Check if JVM restarts
|
||||
char *frameworkPath, *javaPath, *jnaLibPath, *userDir, *userHome, *memMin, *memMax, *arcDNS;
|
||||
asprintf(&frameworkPath, "-Djava.library.path=%1$s/Frameworks:%1$s/Frameworks/libOSMesaOverride.dylib.framework:%1$s/Frameworks/libMoltenVK.dylib.framework", getenv("BUNDLE_PATH"));
|
||||
@@ -238,6 +212,11 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi
|
||||
margv[++margc] = (char *) [NSString stringWithFormat:@"-Dpojav.selectedAccount=%@", selectedAccount].UTF8String;
|
||||
}
|
||||
|
||||
// Setup Caciocavallo
|
||||
margv[++margc] = "-Djava.awt.headless=false";
|
||||
margv[++margc] = "-Dcacio.font.fontmanager=sun.awt.X11FontManager";
|
||||
margv[++margc] = "-Dcacio.font.fontscaler=sun.font.FreetypeFontScaler";
|
||||
|
||||
// Load java
|
||||
char libjlipath8[2048]; // java 8
|
||||
char libjlipath16[2048]; // java 16+ (?)
|
||||
@@ -257,38 +236,69 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi
|
||||
}
|
||||
|
||||
// Setup Caciocavallo
|
||||
margv[++margc] = "-Djava.awt.headless=false";
|
||||
margv[++margc] = "-Dcacio.font.fontmanager=sun.awt.X11FontManager";
|
||||
margv[++margc] = "-Dcacio.font.fontscaler=sun.font.FreetypeFontScaler";
|
||||
margv[++margc] = "-Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel";
|
||||
margv[++margc] = "-Dawt.toolkit=net.java.openjdk.cacio.ctc.CTCToolkit";
|
||||
margv[++margc] = "-Djava.awt.graphicsenv=net.java.openjdk.cacio.ctc.CTCGraphicsEnvironment";
|
||||
|
||||
// Generate Caciocavallo bootclasspath
|
||||
char cacio_libs_path[2048];
|
||||
char cacio_classpath[8192];
|
||||
sprintf((char*) cacio_libs_path, "%s/libs_caciocavallo", getenv("BUNDLE_PATH"));
|
||||
cplen = sprintf(cacio_classpath, "-Xbootclasspath/p");
|
||||
d = opendir(cacio_libs_path);
|
||||
int skip = 2;
|
||||
if (d) {
|
||||
while ((dir = readdir(d)) != NULL) {
|
||||
if (skip > 0) {
|
||||
--skip;
|
||||
continue;
|
||||
}
|
||||
cplen += sprintf(cacio_classpath + cplen, ":%s/%s", cacio_libs_path, dir->d_name);
|
||||
}
|
||||
closedir(d);
|
||||
}
|
||||
margv[++margc] = cacio_classpath;
|
||||
} else {
|
||||
// Required by Cosmetica to inject DNS
|
||||
margv[++margc] = "--add-opens=java.base/java.net=ALL-UNNAMED";
|
||||
|
||||
// Setup Caciocavallo
|
||||
margv[++margc] = "-Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel";
|
||||
margv[++margc] = "-Dawt.toolkit=com.github.caciocavallosilano.cacio.ctc.CTCToolkit";
|
||||
margv[++margc] = "-Djava.awt.graphicsenv=com.github.caciocavallosilano.cacio.ctc.CTCGraphicsEnvironment";
|
||||
// Required by Caciocavallo17 to access internal API
|
||||
margv[++margc] = "--add-exports=java.desktop/java.awt=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.desktop/java.awt.peer=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.desktop/sun.awt.image=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.desktop/sun.java2d=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.desktop/java.awt.dnd.peer=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.desktop/sun.awt=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.desktop/sun.awt.event=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.desktop/sun.awt.datatransfer=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.desktop/sun.font=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-exports=java.base/sun.security.action=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-opens=java.base/java.util=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-opens=java.desktop/java.awt=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-opens=java.desktop/sun.font=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-opens=java.desktop/sun.java2d=ALL-UNNAMED";
|
||||
margv[++margc] = "--add-opens=java.base/java.lang.reflect=ALL-UNNAMED";
|
||||
|
||||
// TODO: workaround, will be removed once the startup part works without PLaunchApp
|
||||
margv[++margc] = "--add-exports=cpw.mods.bootstraplauncher/cpw.mods.bootstraplauncher=ALL-UNNAMED";
|
||||
}
|
||||
|
||||
// Add Caciocavallo bootclasspath
|
||||
NSString *cacio_classpath = [NSString stringWithFormat:@"-Xbootclasspath/%s", isJava8 ? "p" : "a"];
|
||||
NSString *cacio_libs_path = [NSString stringWithFormat:@"%s/libs_caciocavallo%s", getenv("BUNDLE_PATH"), isJava8 ? "" : "17"];
|
||||
NSArray *files = [fm contentsOfDirectoryAtPath:cacio_libs_path error:nil];
|
||||
for(NSString *file in files) {
|
||||
if ([file hasSuffix:@".jar"]) {
|
||||
cacio_classpath = [NSString stringWithFormat:@"%@:%@/%@", cacio_classpath, cacio_libs_path, file];
|
||||
}
|
||||
}
|
||||
margv[++margc] = (char *)cacio_classpath.UTF8String;
|
||||
|
||||
/*
|
||||
char cacio_libs_path[2048];
|
||||
char cacio_classpath[8192];
|
||||
sprintf((char*) cacio_libs_path, "%s/libs_caciocavallo", getenv("BUNDLE_PATH"));
|
||||
cplen = sprintf(cacio_classpath, "-Xbootclasspath/p");
|
||||
d = opendir(cacio_libs_path);
|
||||
int skip = 2;
|
||||
if (d) {
|
||||
while ((dir = readdir(d)) != NULL) {
|
||||
if (skip > 0) {
|
||||
--skip;
|
||||
continue;
|
||||
}
|
||||
cplen += sprintf(cacio_classpath + cplen, ":%s/%s", cacio_libs_path, dir->d_name);
|
||||
}
|
||||
closedir(d);
|
||||
}
|
||||
margv[++margc] = cacio_classpath;
|
||||
*/
|
||||
|
||||
if (!getEntitlementValue(@"com.apple.developer.kernel.extended-virtual-addressing")) {
|
||||
// In jailed environment, where extended virtual addressing entitlement isn't
|
||||
// present (for free dev account), the maximum metaspace size is 896M.
|
||||
@@ -311,7 +321,7 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi
|
||||
regLog("[Init] Found JLI lib");
|
||||
|
||||
margv[++margc] = "-cp";
|
||||
margv[++margc] = classpath;
|
||||
margv[++margc] = (char *)[NSString stringWithFormat:@"%s/*", java_libs_path].UTF8String;
|
||||
margv[++margc] = "net.kdt.pojavlaunch.PojavLauncher";
|
||||
|
||||
if (username == nil) {
|
||||
|
||||
@@ -253,24 +253,11 @@ int versionSelectedAt = 0;
|
||||
}
|
||||
|
||||
- (void)enterModInstaller:(UIBarButtonItem*)sender {
|
||||
NSString *javaVer = getPreference(@"java_home");
|
||||
NSFileManager *fileManager = [NSFileManager defaultManager];
|
||||
if(![fileManager fileExistsAtPath:JRE8_HOME_JB] && getenv("POJAV_DETECTEDJB")) {
|
||||
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Cannot use the mod installer" message:@"In order to use the mod installer, you need to install Java 8." preferredStyle:UIAlertControllerStyleActionSheet];
|
||||
if (alert.popoverPresentationController != nil) {
|
||||
alert.popoverPresentationController.sourceView = self.view;
|
||||
alert.popoverPresentationController.sourceRect = CGRectMake(self.view.frame.size.width-10.0, 0, 10, 10);
|
||||
}
|
||||
UIAlertAction *ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:nil];
|
||||
[self presentViewController:alert animated:YES completion:nil];
|
||||
[alert addAction:ok];
|
||||
} else {
|
||||
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"com.sun.java-archive"]
|
||||
inMode:UIDocumentPickerModeImport];
|
||||
documentPicker.delegate = self;
|
||||
documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
|
||||
[self presentViewController:documentPicker animated:YES completion:nil];
|
||||
}
|
||||
UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"com.sun.java-archive"]
|
||||
inMode:UIDocumentPickerModeImport];
|
||||
documentPicker.delegate = self;
|
||||
documentPicker.modalPresentationStyle = UIModalPresentationFormSheet;
|
||||
[self presentViewController:documentPicker animated:YES completion:nil];
|
||||
}
|
||||
|
||||
- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url {
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
#include "../jni.h"
|
||||
|
||||
jfieldID colorValueID;
|
||||
//jfieldID colorValueID;
|
||||
|
||||
// java.awt.*
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_awt_AWTEvent_initIDs(JNIEnv *env, jclass cls)
|
||||
{
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_awt_Button_initIDs
|
||||
(JNIEnv *env, jclass cls)
|
||||
@@ -13,7 +18,7 @@ JNIEXPORT void JNICALL
|
||||
Java_java_awt_Color_initIDs
|
||||
(JNIEnv *env, jclass clazz)
|
||||
{
|
||||
colorValueID = (*env)->GetFieldID(env, clazz, "value", "I");
|
||||
//colorValueID = (*env)->GetFieldID(env, clazz, "value", "I");
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
@@ -97,6 +102,11 @@ Java_java_awt_Frame_initIDs
|
||||
{
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_awt_Insets_initIDs(JNIEnv *env, jclass cls)
|
||||
{
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_awt_KeyboardFocusManager_initIDs
|
||||
(JNIEnv *env, jclass cls)
|
||||
@@ -191,6 +201,16 @@ Java_java_awt_AWTEvent_nativeSetSource(JNIEnv *env, jobject self, jobject newSou
|
||||
// Maybe implement this?
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_awt_event_InputEvent_initIDs(JNIEnv *env, jclass cls)
|
||||
{
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_awt_event_KeyEvent_initIDs(JNIEnv *env, jclass cls)
|
||||
{
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_awt_event_MouseEvent_initIDs
|
||||
(JNIEnv *env, jclass clazz)
|
||||
|
||||
+3
-2
@@ -231,10 +231,11 @@ int main(int argc, char * argv[]) {
|
||||
setenv("HOME", "/usr/share", 1);
|
||||
setenv("OLD_POJAV_HOME", "/var/mobile/Documents/.pojavlauncher", 1);
|
||||
setenv("POJAV_HOME", "/usr/share/pojavlauncher", 1);
|
||||
// In this environment, libawt_xawt is not available/X11 only.
|
||||
// hook dlopen to use our libawt_xawt
|
||||
init_hookFunctions();
|
||||
} else {
|
||||
setenv("POJAV_HOME", [NSString stringWithFormat:@"%s/Documents", getenv("HOME")].UTF8String, 1);
|
||||
|
||||
init_hookFunctions();
|
||||
}
|
||||
|
||||
[fm createDirectoryAtPath:@(getenv("POJAV_HOME")) withIntermediateDirectories:NO attributes:nil error:nil];
|
||||
|
||||
+7
-88
@@ -1,103 +1,22 @@
|
||||
#include <dlfcn.h>
|
||||
#include <fnmatch.h>
|
||||
#include <libgen.h>
|
||||
#include <spawn.h>
|
||||
#include <stdio.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include "external/fishhook/fishhook.h"
|
||||
#import "utils.h"
|
||||
|
||||
int main(int argc, char * argv[]);
|
||||
|
||||
static CFRunLoopRunResult (*orig_CFRunLoopRunInMode)(CFRunLoopMode mode, CFTimeInterval seconds, Boolean returnAfterSourceHandled);
|
||||
|
||||
static int (*orig_dladdr)(const void* addr, Dl_info* info);
|
||||
static void* (*orig_dlopen)(const char* path, int mode);
|
||||
//static void* (*orig_mmap)(void *addr, size_t len, int prot, int flags, int fd, off_t offset);
|
||||
static char* (*orig_realpath)(const char *restrict path, char *restrict resolved_path);
|
||||
pid_t (*orig_waitpid)(pid_t pid, int *status, int options);
|
||||
//static void (*orig_sys_icache_invalidate)(void *start, size_t len);
|
||||
|
||||
|
||||
int hooked_dladdr(const void* addr, Dl_info* info) {
|
||||
//NSLog(@"hook dladdr(%p, %p)", addr, info);
|
||||
int retVal = orig_dladdr(addr, info);
|
||||
if (addr == main) {
|
||||
//NSLog(@"hooked dladdr");
|
||||
info->dli_fname = getenv("JAVA_EXT_EXECNAME");
|
||||
} else if (retVal != 0) {
|
||||
//NSLog(@"hooked dladdr");
|
||||
char *libname = basename((char *)info->dli_fname);
|
||||
char src[2048], dst[2048];
|
||||
sprintf((char *)src, "%s/Frameworks", getenv("BUNDLE_PATH"));
|
||||
if (0 == strncmp(info->dli_fname, src, strlen(src))) {
|
||||
if (0 == strncmp(libname, "libjli.dylib", 12)) {
|
||||
info->dli_fname = getenv("INTERNAL_JLI_PATH");
|
||||
} else if (0 == strncmp(libname, "libjvm.dylib", 12)) {
|
||||
sprintf((char *)dst, "%s/lib/server/libjvm.dylib", getenv("JAVA_HOME"));
|
||||
info->dli_fname = (char *)dst;
|
||||
}
|
||||
}
|
||||
}
|
||||
//if (retVal) NSLog(@"dli_fname=%s", info->dli_fname);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
void* hooked_dlopen(const char* path, int mode) {
|
||||
//NSLog(@"dlopen(%s, %d)", path, mode);
|
||||
|
||||
// Avoid loading the executable itself twice
|
||||
if (path && [@(path) hasSuffix:@"PojavLauncher"]) {
|
||||
return orig_dlopen(NULL, mode);
|
||||
// Load our libawt_xawt
|
||||
if (path && [@(path) hasSuffix:@"/libawt_xawt.dylib"]) {
|
||||
return orig_dlopen([NSString stringWithFormat:@"%s/Frameworks/libawt_xawt.dylib", getenv("BUNDLE_PATH")].UTF8String, mode);
|
||||
}
|
||||
|
||||
return orig_dlopen(path, mode);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
void *hooked_mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) {
|
||||
NSLog(@"mmap(%p, %ld, %d, %d, %d, %lld)", addr, len, prot, flags, fd, offset);
|
||||
|
||||
if (flags & MAP_JIT) {
|
||||
NSLog(@"'-> Found JIT mmap");
|
||||
//flags &= ~MAP_JIT;
|
||||
}
|
||||
|
||||
// raise(SIGINT);
|
||||
return orig_mmap(addr, len, prot, flags, fd, offset);
|
||||
}
|
||||
*/
|
||||
|
||||
char *hooked_realpath(const char *restrict path, char *restrict resolved_path) {
|
||||
//NSLog(@"hook realpath %s", path);
|
||||
const char *javaHome = getenv("JAVA_HOME");
|
||||
if (0 == strncmp(path, javaHome, strlen(javaHome))) {
|
||||
strcpy(resolved_path, path);
|
||||
return resolved_path;
|
||||
} else {
|
||||
return orig_realpath(path, resolved_path);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
void hooked_sys_icache_invalidate(void *start, size_t len) {
|
||||
// mprotect(start, 16384, PROT_EXEC | PROT_READ);
|
||||
// NSLog(@"mprotect errno %d", errno);
|
||||
orig_sys_icache_invalidate(start, len);
|
||||
}
|
||||
*/
|
||||
|
||||
void init_hookFunctions() {
|
||||
// if (!started && strncmp(argv[0], "/Applications", 13))
|
||||
// Jailed only: hook some functions for symlinked JRE home dir
|
||||
int retval = rebind_symbols((struct rebinding[3]){
|
||||
{"dladdr", hooked_dladdr, (void *)&orig_dladdr},
|
||||
{"dlopen", hooked_dlopen, (void *)&orig_dlopen},
|
||||
//{"realpath", hooked_realpath, (void *)&orig_realpath},
|
||||
{"realpath$DARWIN_EXTSN", hooked_realpath, (void *)&orig_realpath}
|
||||
//{"mmap", hooked_mmap, (void *)&orig_mmap},
|
||||
//{"sys_icache_invalidate", hooked_sys_icache_invalidate, (void *)&orig_sys_icache_invalidate}
|
||||
}, 3);
|
||||
int retval = rebind_symbols((struct rebinding[1]){
|
||||
{"dlopen", hooked_dlopen, (void *)&orig_dlopen},
|
||||
}, 1);
|
||||
NSLog(@"hook retval = %d", retval);
|
||||
}
|
||||
Reference in new issue
Block a user