根本原因是插件未注册成功,因前端调用名、nativeplugins/目录名、package.json的name字段三者不一致且严格区分大小写,缺一不可。

uni.requireNativePlugin 返回 undefined 的根本原因
这不是 JS 报错,而是插件根本没注册成功。白名单配置错误只是其中一环,但最容易被忽略的是三处名字不一致:前端调用的字符串、nativeplugins/目录名、package.json里的name字段——缺一不可,且严格区分大小写。
nativeplugins 目录结构与 package.json 白名单逻辑
uni-app 不扫描子目录,只认项目根目录下名为 nativeplugins 的文件夹(不能是 NativePlugins 或 native-plugins)。每个插件必须是其直接子目录,比如 nativeplugins/RfidModule。
package.json 必须放在该插件目录根下,且内容需包含:
{
"name": "RfidModule",
"platforms": ["android"],
"android": {
"class": "com.example.rfid.RfidModule"
}
}
关键点:
-
name值必须和目录名、uni.requireNativePlugin('RfidModule')参数完全一致 -
android.class是 Java 完整类路径,不是包名,也不是模块名;少一个点或大小写错,运行时报NoClassDefFoundError - 如果只支持 Android,
platforms可只写["android"],但不能省略android字段
AndroidManifest.xml 和云端打包对白名单的影响
自 HBuilderX 3.6.0 起,你可以在项目根目录新建 AndroidManifest.xml,但它**不参与插件白名单校验**,只用于权限、meta-data 或 application 级配置。插件是否被加载,完全取决于 nativeplugins/ 结构 + package.json + 构建时的扫描逻辑。
注意:
- 真机运行(
运行 → 运行到手机或模拟器)时,nativeplugins不生效,必须提交云端打包或离线打包才能验证插件是否注册成功 - 云端打包日志里若出现
skip plugin xxx: not found in nativeplugins,说明目录名或package.json名字不匹配 - 如果插件含
.aar,它必须放在nativeplugins/RfidModule/android/下,不能塞进android/libs/子目录
调试时最常踩的三个坑
白名单看似简单,但实际调试中 80% 的失败都卡在这些细节上:
- 在 HBuilderX 中右键新建文件夹,误命名为
nativeplugin(少 s)或nativePlugins(大小写混) -
package.json放在了nativeplugins/RfidModule/android/里,而不是RfidModule/根下 - Java 类继承了
UniModule,但没加@UniJSMethod注解,或写了@UniJSMethod(uiThread = true)却在方法里做了耗时操作,导致主线程卡死、JS 调用超时失败,看起来像插件不存在
真正生效的白名单,不是写在某个配置项里,而是由这三者共同构成的硬性契约:目录名、package.json.name、uni.requireNativePlugin() 参数。少一个字符,就断联。


















