对接原生模块方面,其实官网讲得已经非常详细了,这里不多做赘述,详情点击这里。
虽然详细,但是还是得补充一些点,如下:
1、创建自定义原生模块文件之前需要先将自己的sdk放置在/android/app/libs下(如果没有libs,则需要新建该文件夹,然后将sdk放进去)
2、修改/android/app/build.gradle文件,添加如下配置:
android {
...
defaultConfig {
...
ndk {//设置支持的SO库架构
abiFilters 'armeabi-v7a','arm64-v8a' //,'x86', 'arm64-v8a'
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
}
dependencies {
...
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation files('libs/xxxx.jar')
}
3、接下来就按照官网步骤进行即可。(需要注意的是官网中有的代码中逗号用的是中文逗号,不仔细看可能看不出来,这个也是踩的其中一个坑!)
本文仅指出两个例子,其他地方还需大家自行编译尝试
4、需要注意的地方:kt文件中的日志输出必须传递两个参数(而且还得是string类型的),第一个参数是模块名称,第二个参数可以是你想打印的结果,和前端的console.log()不太一样,这点值得注意。
5、查看第四点的日志方法是在Android Studio屏幕的左下角点击logCat。如果结果太多,右边有搜索框,输入你的日志方法中的第一个参数即可。
6、对接sdk模块时,由于sdk中的方法都是异步的,所以需要导入promise包
import com.facebook.react.bridge.Promise
@ReactMethod fun init(promise: Promise) { // 此方法写在自己定义的模块kt文件中
// 获取应用程序上下文
val context: Context = reactApplicationContext.applicationContext // 该context也需进行导入 import android.content.Context
// 调用 SDK 的初始化方法并传入上下文
val initResult: Int = PlayerSdk.init(context)
// 将结果通过回调函数返回给 JavaScript 端
// 根据结果创建 Promise 对象并返回给 JavaScript 端
if (initResult == 0) {
promise.resolve("SDK_OK")
} else {
promise.reject("SDK 初始化失败")
}
Log.d("initResult", ""+initResult+"")
}
7、前端进行调用时也需要使用.then进行调用
import { NativeModules } from 'react-native';
const { XXXModule } = NativeModules; // 自己定义的模块名称
const [result, setResult] = useState(''); // 修改state进行展示,可以根据自己的需求来
PlayerSdkModule.init().then((message) => {
setResult(message)
console.log(message);
})
.catch((error) => {
result = error
console.error(error);
});
return (
<View>
<Text>{result}</Text>
</View>
);