Xamarin编译C#代码为Android代码(就是Java代码),出现了语法错误

在继承org.apache.http.conn.ssl.SSLSocketFactory类时引发的问题

C#代码是这样的

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using AndroidPay.Droid.WeChat.InterfaceImpl;
using Java.Net;
using Java.Security;
using Javax.Net.Ssl;
using Org.Apache.Http.Conn.Schemes;
using Org.Apache.Http.Params;
using MySSLSocketFactory = Org.Apache.Http.Conn.Ssl.SSLSocketFactory;

namespace AndroidPay.Droid.WeChat
{
    public class SSLSocketFactoryEx : MySSLSocketFactory
    {
        SSLContext sslContext = SSLContext.GetInstance("TLS");

        public SSLSocketFactoryEx(KeyStore truststore) : base(truststore)
        {
            var tm = new X509TrustManager();

            sslContext.Init(null, new X509TrustManager[] { tm }, new SecureRandom());

            //HttpsURLConnection.DefaultSSLSocketFactory = sslContext.SocketFactory;
            //HttpsURLConnection.DefaultHostnameVerifier = new HostnameVerifier();
        }

        protected SSLSocketFactoryEx(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {
        }

        public SSLSocketFactoryEx(string algorithm, KeyStore keystore, string keystorePassword, KeyStore truststore, SecureRandom random, IHostNameResolver nameResolver) : base(algorithm, keystore, keystorePassword, truststore, random, nameResolver)
        {
        }

        public SSLSocketFactoryEx(KeyStore keystore, string keystorePassword) : base(keystore, keystorePassword)
        {
        }

        public SSLSocketFactoryEx(KeyStore keystore, string keystorePassword, KeyStore truststore) : base(keystore, keystorePassword, truststore)
        {
        }

        public override Java.Net.Socket CreateSocket(Java.Net.Socket socket, string host, int port, bool autoClose)
        {
            return sslContext.SocketFactory.CreateSocket(socket, host, port, autoClose);
        }

        public override Java.Net.Socket CreateSocket()
        {
            return sslContext.SocketFactory.CreateSocket();
        }

        public Java.Net.Socket ConnectSocket(Java.Net.Socket socket, string host, int port, InetAddress localAddress, int localPort, IHttpParams @params)
        {
            SocketAddress address = new InetSocketAddress(host, port);
            try
            {
                socket.Connect(address);
            }
            catch (Exception e)
            {
                // TODO Auto-generated catch block  
                Console.WriteLine(e.StackTrace);
            }// 连接远程主机

            return socket;
        }

        /// <summary>
        /// 直接返回是安全的
        /// </summary>
        /// <param name="sock"></param>
        /// <returns></returns>
        public bool IsSecure(Java.Net.Socket sock)
        {
            return true;
        }
    }
}

Xamarin生成之后的Java代码是这样的

package md59ec0712001a0e18b175d1b41ba922255;


public class SSLSocketFactoryEx
	extends org.apache.http.conn.ssl.SSLSocketFactory
	implements
		mono.android.IGCUserPeer
{
/** @hide */
	public static final String __md_methods;
	static {
		__md_methods = 
			"n_createSocket:(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;:GetCreateSocket_Ljava_net_Socket_Ljava_lang_String_IZHandler\n" +
			"n_createSocket:()Ljava/net/Socket;:GetCreateSocketHandler\n" +
			"";
		mono.android.Runtime.register ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", SSLSocketFactoryEx.class, __md_methods);
	}


	public SSLSocketFactoryEx (java.lang.String p0, java.security.KeyStore p1, java.lang.String p2, java.security.KeyStore p3, java.security.SecureRandom p4, org.apache.http.conn.scheme.HostNameResolver p5)
	{
		super (p0, p1, p2, p3, p4, p5);
		if (getClass () == SSLSocketFactoryEx.class)
			mono.android.TypeManager.Activate ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", "System.String, mscorlib:Java.Security.KeyStore, Mono.Android:System.String, mscorlib:Java.Security.KeyStore, Mono.Android:Java.Security.SecureRandom, Mono.Android:Org.Apache.Http.Conn.Schemes.IHostNameResolver, Mono.Android", this, new java.lang.Object[] { p0, p1, p2, p3, p4, p5 });
	}


	public SSLSocketFactoryEx (java.security.KeyStore p0)
	{
		super (p0);
		if (getClass () == SSLSocketFactoryEx.class)
			mono.android.TypeManager.Activate ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", "Java.Security.KeyStore, Mono.Android", this, new java.lang.Object[] { p0 });
	}


	public SSLSocketFactoryEx (java.security.KeyStore p0, java.lang.String p1)
	{
		super (p0, p1);
		if (getClass () == SSLSocketFactoryEx.class)
			mono.android.TypeManager.Activate ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", "Java.Security.KeyStore, Mono.Android:System.String, mscorlib", this, new java.lang.Object[] { p0, p1 });
	}


	public SSLSocketFactoryEx (java.security.KeyStore p0, java.lang.String p1, java.security.KeyStore p2)
	{
		super (p0, p1, p2);
		if (getClass () == SSLSocketFactoryEx.class)
			mono.android.TypeManager.Activate ("AndroidPay.Droid.WeChat.SSLSocketFactoryEx, AndroidPay.Android", "Java.Security.KeyStore, Mono.Android:System.String, mscorlib:Java.Security.KeyStore, Mono.Android", this, new java.lang.Object[] { p0, p1, p2 });
	}


	public java.net.Socket createSocket (java.net.Socket p0, java.lang.String p1, int p2, boolean p3)
	{
		return n_createSocket (p0, p1, p2, p3);
	}

	private native java.net.Socket n_createSocket (java.net.Socket p0, java.lang.String p1, int p2, boolean p3);


	public java.net.Socket createSocket ()
	{
		return n_createSocket ();
	}

	private native java.net.Socket n_createSocket ();

	private java.util.ArrayList refList;
	public void monodroidAddReference (java.lang.Object obj)
	{
		if (refList == null)
			refList = new java.util.ArrayList ();
		refList.add (obj);
	}

	public void monodroidClearReferences ()
	{
		if (refList != null)
			refList.clear ();
	}
}

正确生成的Java代码应该是这样的(里面应当有throws的处理)

package test;

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;

public class SSLSocketFactoryEx
	extends org.apache.http.conn.ssl.SSLSocketFactory
{
/** @hide */
	public static final String __md_methods;
	static {
		__md_methods = 
			"n_createSocket:(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;:GetCreateSocket_Ljava_net_Socket_Ljava_lang_String_IZHandler\n" +
			"n_createSocket:()Ljava/net/Socket;:GetCreateSocketHandler\n" +
			"";
	}


	public SSLSocketFactoryEx (java.lang.String p0, java.security.KeyStore p1, java.lang.String p2, java.security.KeyStore p3, java.security.SecureRandom p4, org.apache.http.conn.scheme.HostNameResolver p5) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException
	{
		super (p0, p1, p2, p3, p4, p5);
	}


	public SSLSocketFactoryEx (java.security.KeyStore p0) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException
	{
		super (p0);
	}


	public SSLSocketFactoryEx (java.security.KeyStore p0, java.lang.String p1) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException
	{
		super (p0, p1);
	}


	public SSLSocketFactoryEx (java.security.KeyStore p0, java.lang.String p1, java.security.KeyStore p2) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException
	{
		super (p0, p1, p2);
	}


	public java.net.Socket createSocket (java.net.Socket p0, java.lang.String p1, int p2, boolean p3)
	{
		return n_createSocket (p0, p1, p2, p3);
	}

	private native java.net.Socket n_createSocket (java.net.Socket p0, java.lang.String p1, int p2, boolean p3);


	public java.net.Socket createSocket ()
	{
		return n_createSocket ();
	}

	private native java.net.Socket n_createSocket ();

	private java.util.ArrayList refList;
	public void monodroidAddReference (java.lang.Object obj)
	{
		if (refList == null)
			refList = new java.util.ArrayList ();
		refList.add (obj);
	}

	public void monodroidClearReferences ()
	{
		if (refList != null)
			refList.clear ();
	}
}

疑问

这个Xamarin应该在存在C#代码到Java代码转换的缺陷。

寻求帮助

	由于每次生成,Java文件都会重新生成一次。改了也没用,报错依然存在。有谁有办法能从代码中直接进行优化?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值