按照React Native的迭代速度,使用官網的文檔,已經不能很順利的實現React Native和Android的有效整合。React Native最新版本 已經是0.39。為了更好的講解React Native和Android的整合我這里列出我本地的環境:
這一步按照AS新建項目向導一步步完成即可,完成后。
<uses-permission android:name="android.permission.INTERNET" /><application ...><activity android:name="com.facebook.react.devsupport.DevSettingsActivity" /></application>
注:compile SDK 和target SDK都是24(網上有文章講,使用的appcompat-v7支持包版本必須是23.0.1,compile SDK和target SDK也必須是23 。不過最新的也支持的)
compile 'com.android.support:appcompat-v7:24.2.1'
如果你出現下面的錯誤,可以降低版本到23.
Caused by: java.lang.IllegalAccessError: Method 'void android.support.v4.net.ConnectivityManagerCompat.<init>()' is inaccessible to class 'com.facebook.react.modules.netinfo.NetInfoModule' (declaration of 'com.facebook.react.modules.netinfo.NetInfoModule' appears in /data/app/com.milter.www.awesomeproject2-2/base.apk)
其實整合的過程就是將一個原生的Android項目,轉換為滿足React Native結構格式的項目React Native項目結構。
npm init
這個命令會引導你在ReactNativeWithNativeApp目錄下創建一個package.json文件。如圖所示:
接下來我們對package.json文件進行修改,修改部分如下:
"scripts": { "test": "echo "Error: no test specified" && exit 1" }
修改為:
"scripts": { "test": "echo "Error: no test specified" && exit 1" ,"start": "node node_modules/react-native/local-cli/cli.js start" }
修改后,我們在項目根目錄的命令行窗口中輸入命令:
npm start
就相當于執行如下命令:
node node_modules/react-native/local-cli/cli.js start
隨著package.json文件的創建,我們的項目也變成了一個Node項目。
在項目根目錄下輸入如下的命令:
npm install --save react react-native
執行完后我們發現項目多了一個node_modules文件,react native依賴的庫都會在這里看到。
curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig
這一命令的作用是將命令中url指向的.flowconfig文件下載到項目的根目錄。在上面的圖packagejson中可以看到這個下載后的文件。關于curl的講解請看curl詳解 注:如果你不想使用curl命令,你可以可以https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig拷貝里的內容存為.flowconfig文件。
在根目錄下創建index.android.js文件,如果你是直接用react-native init demo(項目名),也可以拷貝index.android.js,具體代碼如下:
'use strict';import React from 'react';import { AppRegistry, StyleSheet, Text, View} from 'react-native';class HelloWorld extends React.Component { render() { return ( <View style={styles.container}> <Text style={styles.hello}>Hello, World</Text> </View> ) }}var styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', }, hello: { fontSize: 20, textAlign: 'center', margin: 10, },});AppRegistry.registerComponent('HelloWorld', () => HelloWorld);
在項目根目錄的build.gradle中(注意:不是app模塊中的build.gradle文件)添加依賴。
allprojects { repositories { jcenter() maven { // All of React Native (JS, Android binaries) is installed from npm url "$projectDir/../node_modules/react-native/android" } }
修改MainActivity內容,完整代碼如下:
public class MainActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler { private ReactRootView mReactRootView; private ReactInstanceManager mReactInstanceManager; private LifecycleState mLifecycleState = LifecycleState.BEFORE_RESUME; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 下面的版本判斷代碼官方文檔中沒有, 如果不添加,在6.0以上的Android版本中會報錯 */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(this)) { Intent serviceIntent = new Intent( Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(serviceIntent); } } mReactRootView = new ReactRootView(this); mReactInstanceManager = ReactInstanceManager.builder() .setApplication(getApplication()) .setBundleAssetName("index.android.bundle") .setJSMainModuleName("index.android") .addPackage(new MainReactPackage()) .setUseDeveloperSupport(BuildConfig.DEBUG) .setInitialLifecycleState(mLifecycleState) .build();//下面代碼中的"HelloWorld"來自index.android.js文件中最后一行代碼 mReactRootView.startReactApplication(mReactInstanceManager, "HelloWorld", null); setContentView(mReactRootView); } @Override protected void onPause() { super.onPause(); mLifecycleState = LifecycleState.BEFORE_RESUME; if (mReactInstanceManager != null) { mReactInstanceManager.onHostPause(); } } @Override protected void onResume() { super.onResume(); mLifecycleState = LifecycleState.RESUMED; if (mReactInstanceManager != null) { mReactInstanceManager.onHostResume(this, this); } } @Override protected void onDestroy() { super.onDestroy(); mReactRootView.unmountReactApplication(); mReactRootView = null; if (mReactInstanceManager != null) { mReactInstanceManager.destroy(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (mReactInstanceManager != null) { mReactInstanceManager.onActivityResult(this,requestCode, resultCode, data); } } @Override public void onBackPressed() { if (mReactInstanceManager != null) { mReactInstanceManager.onBackPressed(); } else { super.onBackPressed(); } } @Override public void invokeDefaultOnBackPressed() { super.onBackPressed(); }}
使用npm start命令運行項目,然后使用
react-native run-android
如果報錯,請往下看。如果出現如下錯誤:
java.lang.UnsatisfiedLinkError: could find DSO to load: libreactnativejni.so
這個錯誤的原因是React Native提供的libreactnativejni.so文件是32位,而我們的項目中用了一些不兼容的64位so文件,二者混在一起產生的。解決的辦法就是禁止使用那些64位的so文件。 第一,在項目根目錄下的gradle.properties文件最后加上這樣一句:
android.useDeprecatedNdk=true
第二、在app module下的build.gradle文件中添加如下內容:
android { ... defaultConfig { ... ndk{ abiFilters "armeabi-v7a", "x86" } ... }...}
第三、找出不兼容的64位so文件并禁止它們 在目錄…ReactNativeWithNativeAppappbuildoutputsapk下找到app-debug.apk,并把它解壓,查看一下,解壓后的文件的lib目錄下有沒有這個目錄: arm64-v8a 如果有這個目錄,看看里面的so文件,都是我們要禁止的,禁止的方法如下:假設里面有一個 1.so文件,我們要在app module下的build.gradle文件中做如下修改:
android { ... defaultConfig { ... ndk{ abiFilters "armeabi-v7a", "x86" } packagingOptions { exclude "lib/arm64-v8a/1.so" } ... }...}
好了,整合就說完了,請大家持續關注哦,現在出項目實戰了。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
北京有幾個長途汽車站?北京有10個長途站,四惠長途站在東四環四惠橋東南角的汽車總站東側,是一個很大的。六里橋長途站在六里橋西南3400米,很大。趙公口長途站在南三環趙公口橋西南角,很大的一個。木樨園長途站在南三環木樨園立交橋南4500米,路的東側,比較大。李澤橋是位于西三環李澤橋東北角的一座中型長途車站。八分是一個中型的長途車站,在大望路大望橋南3400米,路的東側。蓮花池是六里橋東300米路北側...
蘋果平板9代怎么下載軟件?再打開ipad9代,上面有光盤驅動的蘋果官方應用軟件市場~apple store。此時可以打開該軟件,在上面查找自己需要可以下載的應用軟件app,直接點擊下載,直接下載造成后再點安裝再試一下。界面找不到的需要在搜索框中直接搜索出去下載安裝再試一下。部分軟件是需要付費下載,此時先全額支付完成后就是可以去下載了。ipadair4下載app每次都要輸入密碼?是參照你的設置要求你...
天車遙控器使用說明?打開遙控器后蓋,按照正確的方法安裝兩節5號堿性電池(不允許使用充電電池)。2.將磁性鑰匙放入遙控器下方的磁性鑰匙槽中。2.按下開始按鈕,遙控器才能正常使用。3.為保證天車運行安全可靠,起吊重物前,需對上、下、東、南、西、北方向進行測試,防止按鈕失靈;4.起吊重物前,檢查天車剎車是否可靠。5.起吊工作完成后,必須按下停止按鈕,拔出磁鐵鑰匙,防止手柄誤操作造成嚴重后果。6.長時間不...