扩展类时发生ClassNotFoundException

时间:2018-08-19 22:39:00

标签: android nativescript

我正在使用TypeScript开发NativeScript Stripe插件。它正在iOS上运行,现在正尝试使其在Android上运行。

我已经能够成功扩展一些Android类(在Extending Classes之后)。但是,在构造类时会给出ClassNotFoundException。

我使用android-dts-generator创建了一个.d.ts文件。它给出了我要扩展的类的签名(缩写):

declare module com {
  export module stripe {
    export module android {
      export class PaymentSession {
        export class PaymentSessionListener {
          public constructor();
          public onError(param0: number, param1: string): void;
          ...
        }}}}}

我扩展如下:

class InternalPaymentListener extends com.stripe.android.PaymentSession.PaymentSessionListener {
  constructor() {
    super();
    return global.__native(this);
  }
  init(p1, p2): InternalPaymentListener { ...; return this; }
  ...
}

当我尝试使用new InternalPaymentListener().init(p1, p2)构造它时,我收到ClassNotFoundException:

JS: ERROR Error: java.lang.ClassNotFoundException: com.tns.gen.com.stripe.android.PaymentSession_PaymentSessionListener_stripe_148_28_InternalPaymentListener
JS:     java.lang.Class.classForName(Native Method)
JS:     java.lang.Class.forName(Class.java:453)
JS:     java.lang.Class.forName(Class.java:378)
JS:     com.tns.Runtime.getClassForName(Runtime.java:1023)
JS:     com.tns.ClassResolver.resolveClass(ClassResolver.java:27)
JS:     com.tns.Runtime.resolveClass(Runtime.java:593)
JS:     com.tns.Runtime.callJSMethodNative(Native Method)
JS:     com.tns.Runtime.dispatchCallJSMethodNative(Runtime.java:1101)
JS:     com.tns.Runtime.callJSMethodImpl(Runtime.java:983)
JS:     com.tns.Runtime.callJSMethod(Runtime.java:970)
JS:     com.tns.Runtime.callJSMethod(Runtime.java:954)
JS:     com.tns.Runtime.callJSMethod(Runtime.java:946)
JS:     com.tns.gen.java.lang.Object_button_19_32_ClickListenerImpl.onClick(Object_button_19_32_ClickListenerImpl.java:17)
JS:     android.view.View.performClick(View.java:6294)
JS:     android.view.View$PerformClick.run(View.java:24770)
JS:     android....

生成的stripe.js文件位于第148行(我认为这是异常将我指向的内容):

function InternalPaymentListener() {
    var _this = _super.call(this) || this;    <-- Line 148
    return global.__native(_this);
}

代码编译时没有错误或警告,因此您认为该类已正确生成。它一直运行到我单击导致构造该类的按钮为止。

有什么办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

好像我找到了自己的问题的答案,所以很快我几乎就尴尬地问到了!

事实证明PaymentSessionListener是一个接口,而不是一个类。我对android-dts-generator生成的.d.ts定义感到困惑。这是正确实现接口的方法(如Mapping the Keys所述):

function createListener() {
  return new com.stripe.android.PaymentSession.PaymentSessionListener({
    onError(param0: number, param1: string): void { ... }
    ...
  });
}