java bridge method can't be invoked on a non injected object

1,163 阅读1分钟

最近在跟安卓应用下的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;
  }

4、参考

github.com/react-nativ…