Skip to content

Commit eda87ba

Browse files
committed
chore: add dexkit as demo for automated JNI registration
1 parent 894caa7 commit eda87ba

File tree

5 files changed

+45
-23
lines changed

5 files changed

+45
-23
lines changed

demo-app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ android {
2929
implementation(libs.androidx.annotation)
3030
implementation(projects.coreSyscall)
3131
implementation(libs.tencent.mmkv)
32+
implementation(libs.luckypray.dexkit)
3233
}
3334

3435
// force Java 8

demo-app/src/main/java/com/example/test/app/StandaloneTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public static void main(String[] args) {
135135
} catch (Exception e) {
136136
System.out.println("Can map memfd as executable: " + e);
137137
}
138-
long handle = TestNativeLoader.load();
138+
long handle = TestNativeLoader.load("libmmkv.so");
139139
System.out.println("Handle: " + handle);
140140
}
141141

demo-app/src/main/java/com/example/test/app/TestMainActivity.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@
2222

2323
import com.tencent.mmkv.MMKV;
2424

25+
import org.luckypray.dexkit.DexKitBridge;
26+
import org.luckypray.dexkit.query.FindClass;
27+
2528
import java.io.FileInputStream;
29+
import java.util.List;
2630

2731
import dev.tmpfs.libcoresyscall.core.IAllocatedMemory;
2832
import dev.tmpfs.libcoresyscall.core.MemoryAccess;
@@ -184,14 +188,27 @@ private String runTests() {
184188
sb.append("domainname = ").append(MemoryAccess.peekCString(utsAddress + domainnameOffset));
185189
sb.append("\n");
186190
sb.append("Native load test: \n");
187-
sb.append("handle = ").append(TestNativeLoader.initialize(this));
191+
Long handle = TestNativeLoader.load("libmmkv.so");
192+
MMKV.initialize(this, ctx -> {
193+
});
194+
sb.append("mmkv handle = ").append(handle);
188195
sb.append("\n");
189196
sb.append("MMKV.version = ").append(MMKV.version());
197+
sb.append("\n");
198+
handle = TestNativeLoader.load("libdexkit.so");
199+
sb.append("dexkit handle = ").append(handle);
200+
sb.append("\n");
201+
try (DexKitBridge bridge = DexKitBridge.create(this.getClassLoader(), false)) {
202+
List<?> clsList = bridge.findClass(FindClass.create());
203+
sb.append("dexkit search class count: ").append(clsList.size());
204+
}
190205
} catch (Exception | LinkageError | AssertionError e) {
191206
sb.append('\n').append("FAIL: \n").append(Log.getStackTraceString(e));
192207
Log.e("TestMainActivity", "runTests", e);
193208
}
194209
sb.append("\n");
210+
sb.append(TestNativeLoader.sLoadLog);
211+
sb.append("\n");
195212
sb.append("cat /proc/self/maps | grep libmmkv.so\n");
196213
sb.append(catProcSelfMapsAndGrep("libmmkv.so"));
197214
return sb.toString();

demo-app/src/main/java/com/example/test/app/TestNativeLoader.java

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,33 @@
44
import android.system.ErrnoException;
55
import android.system.Os;
66
import android.system.OsConstants;
7+
import android.util.Log;
78

89
import androidx.annotation.NonNull;
910

10-
import com.tencent.mmkv.MMKV;
11-
1211
import java.io.ByteArrayOutputStream;
1312
import java.io.File;
1413
import java.io.FileDescriptor;
1514
import java.io.FileOutputStream;
1615
import java.io.IOException;
1716
import java.io.InputStream;
17+
import java.util.HashMap;
18+
import java.util.Map;
1819

1920
import dev.tmpfs.libcoresyscall.core.NativeAccess;
2021
import dev.tmpfs.libcoresyscall.core.NativeHelper;
2122
import dev.tmpfs.libcoresyscall.core.impl.ReflectHelper;
2223
import dev.tmpfs.libcoresyscall.elfloader.DlExtLibraryLoader;
24+
import dev.tmpfs.libcoresyscall.elfloader.NativeRegistrationHelper;
2325

2426
public class TestNativeLoader {
2527

2628
private TestNativeLoader() {
2729
}
2830

29-
private static long sHandle;
31+
private static final Map<String, Long> sHandleMap = new HashMap<>();
32+
33+
public static String sLoadLog = "";
3034

3135
public static String getNativeLibraryDirName(int isa) {
3236
switch (isa) {
@@ -101,28 +105,24 @@ private static FileDescriptor createTempReadOnlyFile(@NonNull Context ctx, @NonN
101105
return fd;
102106
}
103107

104-
public static long initialize(@NonNull Context ctx) {
105-
load();
106-
if (sHandle != 0) {
107-
MMKV.initialize(ctx, libName -> {
108-
// no-op
109-
});
110-
return sHandle;
111-
}
112-
return 0;
113-
}
114108

115-
public static long load() {
116-
if (sHandle != 0) {
117-
return sHandle;
109+
public static synchronized long load(String soname) {
110+
if (sHandleMap.containsKey(soname)) {
111+
return sHandleMap.get(soname);
118112
}
119-
String soname = "libmmkv.so";
113+
120114
byte[] elfData = getElfData(soname);
121115

122-
sHandle = DlExtLibraryLoader.dlopenExtFromMemory(elfData, soname, DlExtLibraryLoader.RTLD_NOW, 0, 0);
116+
long handle = DlExtLibraryLoader.dlopenExtFromMemory(elfData, soname, DlExtLibraryLoader.RTLD_NOW, 0, 0);
117+
118+
if (handle != 0) {
119+
NativeRegistrationHelper.RegistrationSummary summary =
120+
NativeRegistrationHelper.registerNativeMethodsForLibrary(handle, elfData);
121+
122+
Log.d("TestNativeLoader", soname + ": registerNativeMethodsForLibrary: " + summary);
123+
sLoadLog += soname + ": registerNativeMethodsForLibrary: " + summary + "\n";
123124

124-
if (sHandle != 0) {
125-
long jniOnLoad = DlExtLibraryLoader.dlsym(sHandle, "JNI_OnLoad");
125+
long jniOnLoad = DlExtLibraryLoader.dlsym(handle, "JNI_OnLoad");
126126
if (jniOnLoad != 0) {
127127
long javaVm = NativeAccess.getJavaVM();
128128
long ret = NativeAccess.callPointerFunction(jniOnLoad, javaVm, 0);
@@ -131,7 +131,10 @@ public static long load() {
131131
}
132132
}
133133
}
134-
return sHandle;
134+
sHandleMap.put(soname, handle);
135+
Log.d("TestNativeLoader", soname + " -> " + handle);
136+
sLoadLog += soname + " -> " + handle + "\n";
137+
return handle;
135138
}
136139

137140
}

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ compileSdk = "35"
66
androidx-annotation = { module = "androidx.annotation:annotation", version = "1.9.1" }
77
# for test elf loader
88
tencent-mmkv = { module = "com.tencent:mmkv-static", version = "1.3.11" }
9+
luckypray-dexkit = { module = "org.luckypray:dexkit", version = "2.0.3" }
910

1011
[plugins]
1112
android-library = { id = "com.android.library", version.ref = "agp" }

0 commit comments

Comments
 (0)