44import android .system .ErrnoException ;
55import android .system .Os ;
66import android .system .OsConstants ;
7+ import android .util .Log ;
78
89import androidx .annotation .NonNull ;
910
10- import com .tencent .mmkv .MMKV ;
11-
1211import java .io .ByteArrayOutputStream ;
1312import java .io .File ;
1413import java .io .FileDescriptor ;
1514import java .io .FileOutputStream ;
1615import java .io .IOException ;
1716import java .io .InputStream ;
17+ import java .util .HashMap ;
18+ import java .util .Map ;
1819
1920import dev .tmpfs .libcoresyscall .core .NativeAccess ;
2021import dev .tmpfs .libcoresyscall .core .NativeHelper ;
2122import dev .tmpfs .libcoresyscall .core .impl .ReflectHelper ;
2223import dev .tmpfs .libcoresyscall .elfloader .DlExtLibraryLoader ;
24+ import dev .tmpfs .libcoresyscall .elfloader .NativeRegistrationHelper ;
2325
2426public 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}
0 commit comments