最近在跟安卓应用下的webview调试一些暴露出来给web端调用的方法,出现了一些小问题
" java bridge method can't be invoked on a non injected object ",这也是在安卓包调试后,才发现的问题。本文针对这种情况,出现的原因及解决方法做个总结
1、背景:
为了能更方便,更简洁调用安卓应用暴露的方法const getAdClickCount = window?.Android?.getAdClickCount而出现个小问题
private checkAdCount (action:string) {
const count = 6;// 限制展示次数
try {
const getAdClickCount = window?.Android?.getAdClickCount;
if (!this.isReward && count && getAdClickCount && getAdClickCount instanceof Function && getAdClickCount() > count) {
styleConsole(`${action} ${this.isReward ? "rewardAd" : "interstitialAd"} Ad Arrivals count:${count}`);
return true;
}
} catch (error) {
console.error(error);
}
return false;
}
2、原因:
这个错误消息通常与桥接方法(bridge method)和依赖注入设计模式(dependency injection)有关,只能直接调用。桥接方法是Java编译器生成的合成方法,用于在处理泛型类型和继承时确保类型安全。了解了下,整个安卓包暴露给h5调用的原理:
- @JavascriptInterface
public class AndroidObject {
private Context context;
public AndroidObject(Context context) {
this.context = context;
}
@JavascriptInterface
public void getAdClickCount() {
// 在此处编写方法的逻辑,方法使用 `@JavascriptInterface` 注解,以便能够从 WebView 中的 JavaScript 调用
}
}
- webView配置:
// 启用 JavaScript
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
// 将安卓对象注入到 WebView
AndroidObject androidObject = new AndroidObject(this);
webView.addJavascriptInterface(androidObject, "Android");
- 在webView下的h5调用
window.Android.getAdClickCount();
3、解决:
直接使用该对象再调用方法,就可以直接解决
private checkAdCount (action:string) {
const count = 6;// 限制展示次数
try {
const android = window?.Android;
if (!this.isReward && count && android && android.getAdClickCount && android.getAdClickCount instanceof Function && android.getAdClickCount() > count) {
styleConsole(`${action} ${this.isReward ? "rewardAd" : "interstitialAd"} Ad Arrivals count:${count}`);
return true;
}
} catch (error) {
console.error(error);
}
return false;
}