对接原生模块方面,其实官网讲得已经非常详细了,这里不多做赘述,详情点击这里
虽然详细,但是还是得补充一些点,如下:
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>
);
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓(文末还有ChatGPT机器人小福利哦,大家千万不要错过)
PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题