Skip to content
This repository was archived by the owner on Sep 23, 2025. It is now read-only.

Commit 6eb7ecd

Browse files
committed
Fix[JNA]: use agent to replace class at runtime
Fixes duplicate module package on recent Forge versions.
1 parent 4a789ab commit 6eb7ecd

File tree

5 files changed

+47
-2
lines changed

5 files changed

+47
-2
lines changed

JavaApp/Makefile

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
# Prerequisite variables
22
SOURCEDIR := src
33
OUTPUTDIR := build
4+
45
SOURCES := $(shell find $(SOURCEDIR) -type f -name '*.java')
56
CLASSES := $(SOURCES:$(SOURCEDIR)/%.java=$(OUTPUTDIR)/%.class)
67

8+
TARGETS := $(shell find $(SOURCEDIR) -mindepth 1 -maxdepth 1 -type d)
9+
TARGETS := $(TARGETS:$(SOURCEDIR)/%=$(OUTPUTDIR)/%.jar)
10+
711
# Add all jars to classpath and allow compiling with private API
812
JCFLAGS := -cp "$(subst $() $(),:,$(wildcard $(SOURCEDIR)/*/):$(wildcard libs/*/*.jar))" -XDignore.symbol.file
913

10-
all: $(OUTPUTDIR)/launcher.jar $(OUTPUTDIR)/lwjgl.jar
14+
all: $(TARGETS)
1115

1216
# Rules for building java class
1317
$(CLASSES): $(OUTPUTDIR)/%.class: $(SOURCEDIR)/%.java
@@ -22,7 +26,7 @@ $(CLASSES): $(OUTPUTDIR)/%.class: $(SOURCEDIR)/%.java
2226
$(OUTPUTDIR)/launcher.jar: $(CLASSES)
2327
@set -e
2428
@echo "Creating $@"
25-
$(BOOTJDK)/jar -cf $@ -C $(basename $@) .
29+
@$(BOOTJDK)/jar -cf $@ -C $(basename $@) .
2630

2731
$(OUTPUTDIR)/lwjgl.jar: $(CLASSES)
2832
@set -e
@@ -32,6 +36,12 @@ $(OUTPUTDIR)/lwjgl.jar: $(CLASSES)
3236
@cp -R $(OUTPUTDIR)/lwjgl/* $(OUTPUTDIR)/lwjgl_lib/
3337
@$(BOOTJDK)/jar -cf $@ -C $(OUTPUTDIR)/lwjgl_lib .
3438

39+
$(OUTPUTDIR)/patchjna_agent.jar: $(CLASSES)
40+
@set -e
41+
@mv $(basename $@)/com/sun/jna/Platform.class $(basename $@)/com/sun/jna/Platform.class.patch
42+
@echo "Creating $@"
43+
@$(BOOTJDK)/jar -cfm $@ $(SOURCEDIR)/patchjna_agent.txt -C $(basename $@) .
44+
3545
clean:
3646
rm -rf $(OUTPUTDIR)
3747

JavaApp/src/patchjna_agent.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Agent-Class: net.kdt.patchjna.PatchJNAAgent
2+
Premain-Class: net.kdt.patchjna.PatchJNAAgent
File renamed without changes.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package net.kdt.patchjna;
2+
3+
import java.io.*;
4+
import java.lang.instrument.ClassFileTransformer;
5+
import java.lang.instrument.IllegalClassFormatException;
6+
import java.lang.instrument.Instrumentation;
7+
import java.lang.reflect.InvocationTargetException;
8+
import java.security.ProtectionDomain;
9+
10+
public class PatchJNAAgent implements ClassFileTransformer {
11+
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
12+
ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
13+
byte[] transformeredByteCode = classfileBuffer;
14+
if (className.equals("com/sun/jna/Platform")) {
15+
System.out.println("PatchJNAAgent: Replacing class");
16+
try {
17+
InputStream inputStream = PatchJNAAgent.class.getClassLoader().getResourceAsStream("com/sun/jna/Platform.class.patch");
18+
transformeredByteCode = new byte[inputStream.available()];
19+
DataInputStream dataInputStream = new DataInputStream(inputStream);
20+
dataInputStream.readFully(transformeredByteCode);
21+
} catch (Exception e) {
22+
e.printStackTrace();
23+
}
24+
}
25+
return transformeredByteCode;
26+
}
27+
28+
public static void premain(String args, Instrumentation instrumentation) {
29+
System.out.println("PatchJNAAgent: premain called");
30+
instrumentation.addTransformer(new PatchJNAAgent());
31+
}
32+
}

Natives/JavaLauncher.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ int launchJVM(NSString *username, id launchTarget, int width, int height, int mi
199199
}
200200

201201
NSString *librariesPath = [NSString stringWithFormat:@"%@/libs", NSBundle.mainBundle.bundlePath];
202+
margv[++margc] = [NSString stringWithFormat:@"-javaagent:%@/patchjna_agent.jar=", librariesPath].UTF8String;
202203
if(getPrefBool(@"general.cosmetica")) {
203204
margv[++margc] = [NSString stringWithFormat:@"-javaagent:%@/arc_dns_injector.jar=23.95.137.176", librariesPath].UTF8String;
204205
}

0 commit comments

Comments
 (0)