gpt4 book ai didi

java - 如何解决 Stripe xamarin 绑定(bind)错误? (CS0103 名称 'Start' 在当前上下文中不存在)

转载 作者:行者123 更新时间:2023-12-02 01:38:19 28 4
gpt4 key购买 nike

我正在尝试为 Stripe Android SDK 建立新的绑定(bind),因为现有的绑定(bind)已经过时并且缺乏 SCA 身份验证,而 SCA 身份验证是最近发布的一项新功能,欧盟市场将需要该功能。

Stripe 信息:https://stripe.com/docs/mobile/android Stripe 存储库:https://github.com/stripe/stripe-android

我使用的是今天可用的最后一个版本,即 10.2.1,并且只剩下一个错误:

Error CS0103 The name 'Start' does not exist in the current context

我有一些为 Android 进行绑定(bind)的经验,但这个问题很难解决:

如果我转到报告错误的自动生成的类 -PaymentAuthWebViewStarter- 我可以看到以下内容:

    // This method is explicitly implemented as a member of an instantiated Com.Stripe.Android.View.IAuthActivityStarter
void global::Com.Stripe.Android.View.IAuthActivityStarter.Start (global::Java.Lang.Object p0)
{
Start (global::Java.Interop.JavaObjectExtensions.JavaCast<global::Com.Stripe.Android.PaymentAuthWebViewStarter.Data>(p0));
}

但是那里没有 Start 的代码。这是预期的,因为 api.xml 显示了该类的以下代码:

<class abstract="false" deprecated="not deprecated" extends="java.lang.Object" extends-generic-aware="java.lang.Object" jni-extends="Ljava/lang/Object;" final="false" name="PaymentAuthWebViewStarter" static="false" visibility="public" jni-signature="Lcom/stripe/android/PaymentAuthWebViewStarter;">
<implements name="com.stripe.android.view.AuthActivityStarter" name-generic-aware="com.stripe.android.view.AuthActivityStarter&lt;com.stripe.android.PaymentAuthWebViewStarter.Data&gt;" jni-type="Lcom/stripe/android/view/AuthActivityStarter&lt;Lcom/stripe/android/PaymentAuthWebViewStarter$Data;&gt;;">
</implements>
<field deprecated="not deprecated" final="true" name="EXTRA_AUTH_URL" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value="&quot;auth_url&quot;" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_CLIENT_SECRET" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value="&quot;client_secret&quot;" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_RETURN_URL" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value="&quot;return_url&quot;" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_UI_CUSTOMIZATION" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value="&quot;ui_customization&quot;" visibility="public" volatile="false">
</field>
</class>

如您所见,没有任何 Start 方法的痕迹。该接口(interface)已声明并具有预期的 Start 方法签名,如下所示:

<interface abstract="true" deprecated="not deprecated" final="false" name="AuthActivityStarter" static="false" visibility="public" jni-signature="Lcom/stripe/android/view/AuthActivityStarter;">
<typeParameters>
<typeParameter name="StartDataType" classBound="java.lang.Object" jni-classBound="Ljava/lang/Object;"></typeParameter>
</typeParameters>
<method abstract="true" deprecated="not deprecated" final="false" name="start" jni-signature="(Ljava/lang/Object;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
<parameter name="p0" type="StartDataType" jni-type="TStartDataType;">
</parameter>
</method>
</interface>

另一方面,如果我使用 JD-GUI(java 反编译器)查看 .aar 类,我可以看到 Start 是在 PaymentAuthWebViewStarter 类中定义的:

  public void start(@NonNull Data data)
{
Bundle extras = new Bundle();
extras.putString("client_secret", data.mClientSecret);
extras.putString("auth_url", data.mUrl);
extras.putString("return_url", data.mReturnUrl);
extras.putParcelable("ui_customization", this.mToolbarCustomization);

this.mHost.startActivityForResult(PaymentAuthWebViewActivity.class, extras, this.mRequestCode);
}

我的问题是:

为什么这个方法没有像任何其他类中的任何其他方法一样生成?

如何解决这个问题?

我在这里留下了我的代码:https://github.com/guillermo-gerard/stripe.android.sdk.binding/tree/master非常欢迎您 fork 它并尝试解决这个问题。

最佳答案

好吧,再努力一点之后,我会解决我的问题,但我还不确定为什么会发生这种情况。

这些更改已在存储库中发布,但以防万一它对任何人都有帮助:我必须在 Additions 中添加一个部分类来实现对缺失成员的调用,如下所示:

namespace Com.Stripe.Android
{
// This class fixes the Error CS0103 The name 'Start' does not exist in the current context
public partial class PaymentAuthWebViewStarter : global::Java.Lang.Object
{
internal new static readonly JniPeerMembers _members1 = new XAPeerMembers("com/stripe/android/PaymentAuthWebViewStarter", typeof(PaymentAuthWebViewStarter));

// Metadata.xml XPath method reference: path="/api/package[@name='com.stripe.android']/class[@name='PaymentAuthWebViewStarter']/method[@name='start' and count(parameter)=1 and parameter[1][@type='com.stripe.android.PaymentAuthWebViewStarter.Data']]"
[Register("start", "(Lcom/stripe/android/PaymentAuthWebViewStarter$Data;)V",
"GetStart_Lcom_stripe_android_PaymentAuthWebViewStarter_Data_Handler")]
public virtual unsafe void Start(global::Com.Stripe.Android.PaymentAuthWebViewStarter.Data data)
{
const string __id = "start.(Lcom/stripe/android/PaymentAuthWebViewStarter$Data;)V";
try
{
JniArgumentValue* __args = stackalloc JniArgumentValue[1];
__args[0] = new JniArgumentValue(
(data == null) ? IntPtr.Zero : ((global::Java.Lang.Object) data).Handle);
_members1.InstanceMethods.InvokeVirtualVoidMethod(__id, this, __args);
}
finally
{
}
}
}
}

就这样,这解决了编译问题,我已经能够生成 dll 了。将其包含到项目中后,出现新错误,但现在已解决。

免责声明:我还没有完全测试绑定(bind),我只是确定它可以包含在项目中,并且可以使用 Stripe 小部件输入信用卡信息。我尚未测试 SCA 行为或 3DS 身份验证。因此,如果您打算使用此绑定(bind),请对其进行全面测试,如果出现任何问题请告诉我

关于java - 如何解决 Stripe xamarin 绑定(bind)错误? (CS0103 名称 'Start' 在当前上下文中不存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57504300/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com