Skip to content

Commit cadc1b8

Browse files
authored
Merge pull request #35 from mrousavy/try-use-custom-getjsimodules-hook
Try use custom getjsimodules hook
2 parents 870d03e + d2d8e93 commit cadc1b8

6 files changed

Lines changed: 157 additions & 59 deletions

File tree

INSTALL.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
# Install MMKV
2+
3+
MMKV uses JSI which has not been officially released. For now, you have to manually edit a Java file to correctly set up MMKV.
4+
5+
Since react-native-reanimated also uses JSI, there will be conflicts if you install both libraries at the same time. That's why the installation steps are different:
6+
7+
<details>
8+
<summary>Without react-native-reanimated</summary>
9+
10+
To install MMKV without Reanimated, open your Android project (the `android` folder) in Android Studio. In `MainApplication.java` find the location where the `ReactNativeHost` is initialized. You have to override it's `getJSIModulePackage` method:
11+
12+
13+
```java
14+
public class MainApplication extends Application implements ReactApplication {
15+
16+
private final ReactNativeHost mReactNativeHost =
17+
new ReactNativeHost(this) {
18+
@Override
19+
public boolean getUseDeveloperSupport() {
20+
return BuildConfig.DEBUG;
21+
}
22+
23+
@Override
24+
protected List<ReactPackage> getPackages() {
25+
return new PackageList(this).getPackages();
26+
}
27+
28+
@Override
29+
protected String getJSMainModuleName() {
30+
return "index";
31+
}
32+
33+
// Add this method here!
34+
@Override
35+
protected JSIModulePackage getJSIModulePackage() {
36+
return new MmkvModulePackage();
37+
}
38+
};
39+
40+
// ...
41+
```
42+
43+
</details>
44+
45+
<details>
46+
<summary>With react-native-reanimated</summary>
47+
48+
To install MMKV with Reanimated, open your Android project (the `android` folder) in Android Studio.
49+
50+
1. Find the folder where `MainActivity.java` and `MainApplication.java` live.
51+
2. Right click, "New" > "Java class"
52+
3. Call it whatever you prefer, in my case it's `ExampleJSIPackage` because my app is called "Example".
53+
4. Add the following code:
54+
55+
```java
56+
import com.facebook.react.bridge.JSIModulePackage;
57+
import com.facebook.react.bridge.JSIModuleSpec;
58+
import com.facebook.react.bridge.JavaScriptContextHolder;
59+
import com.facebook.react.bridge.ReactApplicationContext;
60+
import com.reactnativemmkv.MmkvModule;
61+
62+
import com.swmansion.reanimated.NodesManager;
63+
import com.swmansion.reanimated.ReanimatedModule;
64+
65+
import java.util.Collections;
66+
import java.util.List;
67+
68+
public class ExampleJSIPackage implements JSIModulePackage {
69+
@Override
70+
public List<JSIModuleSpec> getJSIModules(ReactApplicationContext reactApplicationContext, JavaScriptContextHolder jsContext) {
71+
NodesManager nodesManager = reactApplicationContext.getNativeModule(ReanimatedModule.class).getNodesManager();
72+
nodesManager.initWithContext(reactApplicationContext);
73+
MmkvModule.install(jsContext, reactApplicationContext.getFilesDir().getAbsolutePath() + "/mmkv");
74+
return Collections.emptyList();
75+
}
76+
}
77+
```
78+
79+
5. Open `MainApplication.java` and find the location where the `ReactNativeHost` is initialized. You have to override it's `getJSIModulePackage` method:
80+
81+
```java
82+
public class MainApplication extends Application implements ReactApplication {
83+
84+
private final ReactNativeHost mReactNativeHost =
85+
new ReactNativeHost(this) {
86+
@Override
87+
public boolean getUseDeveloperSupport() {
88+
return BuildConfig.DEBUG;
89+
}
90+
91+
@Override
92+
protected List<ReactPackage> getPackages() {
93+
return new PackageList(this).getPackages();
94+
}
95+
96+
@Override
97+
protected String getJSMainModuleName() {
98+
return "index";
99+
}
100+
101+
// Add this method here!
102+
@Override
103+
protected JSIModulePackage getJSIModulePackage() {
104+
return new ExampleJSIPackage(); // <-- your package's name
105+
}
106+
};
107+
108+
// ...
109+
```
110+
111+
</details>
112+
113+
114+
## Notes
115+
116+
All of this is a temporary workaround. JSI and TurboModules are still actively in development and cannot be autolinked yet. All of this will change very soon and no extra configuration will be needed to use MMKV.

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,20 @@
4747

4848
```sh
4949
npm install react-native-mmkv
50+
```
51+
52+
### iOS
53+
54+
iOS installation is automatic, just run:
55+
56+
```sh
5057
cd ios && pod install
5158
```
5259

60+
### Android
61+
62+
To correctly initialize MMKV on Android, please follow the [Installation guide](./INSTALL.md).
63+
5364
## Usage
5465

5566
### Set
Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,15 @@
11
package com.reactnativemmkv;
22

3-
import androidx.annotation.NonNull;
3+
import com.facebook.react.bridge.JavaScriptContextHolder;
44

5-
import com.facebook.react.bridge.ReactApplicationContext;
6-
import com.facebook.react.bridge.ReactContextBaseJavaModule;
7-
8-
public class MmkvModule extends ReactContextBaseJavaModule {
5+
public class MmkvModule {
96
static {
107
System.loadLibrary("mmkvnative");
118
}
129

13-
private native void nativeInstall(long jsiPtr, String path);
14-
15-
public MmkvModule(ReactApplicationContext context) {
16-
super(context);
17-
}
18-
19-
@NonNull
20-
@Override
21-
public String getName() {
22-
return "MMKV";
23-
}
24-
25-
@Override
26-
public void initialize() {
27-
super.initialize();
10+
private static native void nativeInstall(long jsiPtr, String path);
2811

29-
this.getReactApplicationContext().runOnJSQueueThread(() -> {
30-
nativeInstall(
31-
this.getReactApplicationContext().getJavaScriptContextHolder().get(),
32-
this.getReactApplicationContext().getFilesDir().getAbsolutePath() + "/mmkv"
33-
);
34-
});
12+
public static void install(JavaScriptContextHolder jsContext, String storageDirectory) {
13+
nativeInstall(jsContext.get(), storageDirectory);
3514
}
3615
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.reactnativemmkv;
2+
3+
import com.facebook.react.bridge.JSIModulePackage;
4+
import com.facebook.react.bridge.JSIModuleSpec;
5+
import com.facebook.react.bridge.JavaScriptContextHolder;
6+
import com.facebook.react.bridge.ReactApplicationContext;
7+
import java.util.Collections;
8+
import java.util.List;
9+
10+
public class MmkvModulePackage implements JSIModulePackage {
11+
@Override
12+
public List<JSIModuleSpec> getJSIModules(ReactApplicationContext reactApplicationContext, JavaScriptContextHolder jsContext) {
13+
MmkvModule.install(jsContext, reactApplicationContext.getFilesDir().getAbsolutePath() + "/mmkv");
14+
return Collections.emptyList();
15+
}
16+
}

android/src/main/java/com/reactnativemmkv/MmkvPackage.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

example/android/app/src/main/java/com/example/reactnativemmkv/MainApplication.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,17 @@
22

33
import android.app.Application;
44
import android.content.Context;
5+
56
import com.facebook.react.PackageList;
67
import com.facebook.react.ReactApplication;
78
import com.facebook.react.ReactNativeHost;
89
import com.facebook.react.ReactPackage;
910
import com.facebook.react.ReactInstanceManager;
11+
import com.facebook.react.bridge.JSIModulePackage;
1012
import com.facebook.soloader.SoLoader;
1113
import java.lang.reflect.InvocationTargetException;
1214
import java.util.List;
13-
import com.reactnativemmkv.MmkvPackage;
15+
import com.reactnativemmkv.MmkvModulePackage;
1416

1517
public class MainApplication extends Application implements ReactApplication {
1618

@@ -23,18 +25,18 @@ public boolean getUseDeveloperSupport() {
2325

2426
@Override
2527
protected List<ReactPackage> getPackages() {
26-
@SuppressWarnings("UnnecessaryLocalVariable")
27-
List<ReactPackage> packages = new PackageList(this).getPackages();
28-
// Packages that cannot be autolinked yet can be added manually here, for MmkvExample:
29-
// packages.add(new MyReactNativePackage());
30-
packages.add(new MmkvPackage());
31-
return packages;
28+
return new PackageList(this).getPackages();
3229
}
3330

3431
@Override
3532
protected String getJSMainModuleName() {
3633
return "index";
3734
}
35+
36+
@Override
37+
protected JSIModulePackage getJSIModulePackage() {
38+
return new MmkvModulePackage();
39+
}
3840
};
3941

4042
@Override

0 commit comments

Comments
 (0)