1. 程式人生 > >react-native-android-unity(一)react-native加入android原生

react-native-android-unity(一)react-native加入android原生

 本人是做後端php的,對各類語言和方向都有興趣,多而不精。最近公司專案有一個移動端app,決定採用react-native開發,專案中有這麼個要求,要求react-native中嵌入原生頁面,然後原生頁面嵌入unity,並實現原生和unity之前相互通訊,網路查詢資料後實現這些功能,查詢過程中,遇到很多問題,並且參照了很多網友的部落格,在此做一個記錄,以防後患。

開發環境及工具:

macbook pro, webstorm,android studio,unity

本篇文章是第一篇,實現react-native加入android原生。 

 1.建立react-native專案:react-native init rauDemo

 進入目錄:cd rauDemo

 用webstorm開啟專案進行編輯專案,android studio開啟內部android專案,本步的目的是指定本機的android sdk的路徑,否則會報如下錯誤:

        *What went wrong:

        Aproblem occurred configuring project ':app'.

 > SDK location not found.Define location with sdk.dir in the local.properties file or with anANDROID_HOME environment variable.

測試執行:usb連線手機,react-native run-android

成功執行,如下圖:

2.android studio開啟的android目錄如下:

新增程式碼,將java方法封裝成react可呼叫的方法,按照官方方式:

在src/main/java/com.raudemo下新增程式碼,

(1)新增RedirectModule.java,程式碼如下:

public class RedirectModule extends ReactContextBaseJavaModule {

    public RedirectModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "RedirectModule";
    }

    /**
     * 從JS頁面跳轉到原生activity 同時也可以從JS傳遞相關資料到原生
     * @param name 需要開啟的Activity的class
     * @param params
     */
    @ReactMethod
    public void startActivityFromJS(String name, String params){
        try{
            Activity currentActivity = getCurrentActivity();
            if(null!=currentActivity){
                Class toActivity = Class.forName(name);
                Intent intent = new Intent(currentActivity,toActivity);
                intent.putExtra("params", params);
                currentActivity.startActivity(intent);
            }
        }catch(Exception e){
            throw new JSApplicationIllegalArgumentException(
                    "不能開啟Activity : "+e.getMessage()+e.toString());
        }
    }

}

(2)新增MyReactPackage.java,程式碼如下:

public class MyReactPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        return Arrays.<NativeModule>asList(
                new RedirectModule(reactContext)
        );
    }

    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();

    }
}

(3)MainApplication.java新增程式碼:new MyReactPackage(),最後如下:

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
              new MyReactPackage()
      );
    }

    @Override
    protected String getJSMainModuleName() {
      return "index";
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }

  @Override
  public void onCreate() {
    super.onCreate();
    SoLoader.init(this, /* native exopackage */ false);
  }
}
最後專案結構如圖:

3.android studio新建頁面,命名UnityActuivity,為之後嵌入Unity程式準備。
修改頁面佈局,程式碼包裡有,需要將UnityActivity設定成橫屏,在AndroidManifest.xml裡面UnityActivity新增android:screenOrientation="landscape",原因是Unity匯出的程式會有螢幕橫屏等設定,需要相對應。過後說這個問題

4.修改react-native程式碼:

在App.js內匯入TouchableOpacity和NativeModules元件,NativeModules即為react-native提供的入口,android原生寫的RedirectModule可以通過這個元件讀到。
Return的頁面裡面新增如下程式碼:
<TouchableOpacity onPress={()=>{
    NativeModules.RedirectModule.startActivityFromJS('com.raudemo.UnityActivity','eeeee')
}}>
  <Text>
    跳轉原生android
  </Text>
</TouchableOpacity>
目的是實現點選跳轉原生頁面。
截圖如下:

點選跳轉後如下:

至此,react-native跳轉原生頁面完成。

完整程式碼:稍後奉上