2

我刚刚发现了 dot42,这是一种开发原生 Android 应用程序的 C# 方法。

所以我的第一个项目方式是使用一些旧代码来生成 CRC8 字节。我在项目中创建了一个新类,复制了代码并尝试正常使用它。

我继续得到java.lang.VerifyError??

我的课是简单的数学计算。当我将它作为公共方法分解为主要活动时,它按预期工作。

在此处输入图像描述

但是,如果我尝试使用静态类,我会收到该错误并且我不知道如何找出问题所在?我尝试添加各种 android 命名空间,尝试使其成为一个普通类来实例化,甚至将其更改为internal

该方法CRC8.Compute("mystring")甚至没有进入计算代码(如果我在那里放了一个断点)它只是在方法上抛出错误MainActivity.cs

我必须怎么做才能使用 dot42 来使用这样的类?(我查看了网站上的各种示例,但我无法指出需要做的任何具体事情)

namespace dot42Application1
{
    public class CRC8
    {
        static byte[] table = new byte[256];
        // x8 + x2 + x + 1 
        const byte poly = 0x07;

        public static string Compute(string ASCI)
        {
            int crcByte = Convert.ToInt16(ComputeChecksum(System.Text.Encoding.ASCII.GetBytes(ASCI)).ToString());
            return crcByte.ToString("000");
        }


        public static byte ComputeChecksum(byte[] bytes)
        {
            byte CRCInitialValue = 0xFF;
            //Final XOR value 0x00;
            //Not revered bytes
            //Not reverse CRC berfore final byte

            if (bytes != null && bytes.Length > 0)
            {
                foreach (byte b in bytes)
                {
                    CRCInitialValue = table[CRCInitialValue ^ b];
                }
            }
            return CRCInitialValue;
        }

        public CRC8()
        {
            for (int i = 0; i < 256; ++i)
            {
                int temp = i;
                for (int j = 0; j < 8; ++j)
                {
                    if ((temp & 0x80) != 0)
                    {
                        temp = (temp << 1) ^ poly;
                    }
                    else
                    {
                        temp <<= 1;
                    }
                }
                table[i] = (byte)temp;
            }
        }




    }
}

也许这有帮助。堆栈跟踪显示...

在此处输入图像描述

4

2 回答 2

2

这确实是 dot42 编译器中的一个错误,该行:

int crcByte = Convert.ToInt16(...) 在内部以 short 结束,即 16 位,而不是调用 int 上的 ToString,传递 16 位值,而不将其向上转换为 32 位,从而导致验证错误。

我们(dot42 编译器团队)为此问题创建了一个案例/票证。

作为解决方法,您可以将代码更改为: int crcByte = Convert.ToInt32(...)

希望这可以帮助。

于 2013-09-17T09:43:55.377 回答
1

检查一些可能的问题:

  1. 静态构造函数必须是无参数的。
  2. 成员名称不能与其封闭类型相同。
  3. 属性:最好设置Android API 8 或更高。
  4. 您使用什么 IDE - 也许这就是问题所在?(推荐VS2010)
  5. 您是否安装了最新的 dot42,以及所有必要的许可证和安全密钥?

我在 Win7 操作系统上安装了 VS2010 和最新的 dot42 插件,并尝试模拟您的课程,期望看到相同的错误,但一切编译良好。模拟的静态类放在另一个文件中,在同一个命名空间中。我从其他地方的另一个类调用它的静态方法 - MainActivity 类。

这是模拟类:

using System;
using Android.App;
using Android.Os;
using Android.Widget;
using Dot42;
//using Dot42.Manifest;

namespace MyNamespace
{
    public  class CRC8
    {
        static byte[] table = new byte[256];
        //x8 + x2 + x + 1
        const byte poly = 0x07;

        public static byte getCRC(byte[] _bytes)
        {      return _bytes[0];
        }

        public static byte getCRC(String str_bytes)
        {      return (byte) str_bytes.CharAt(0); 
        }
         static  CRC8()
        {
            //nothing happens so far
        }
    }
}

这是 MainActivity 类中的调用:

protected override void OnCreate(Bundle savedInstance)
        {
            base.OnCreate(savedInstance);
            SetContentView(R.Layouts.MainLayout);

            TextView text_view = (TextView)FindViewById(R.Ids.textView1);

            byte[] aa = { 125, 54, 67, 78, 89 };
            byte b_ret = 0;

            b_ret = CRC8.getCRC("Ala ma kota");
            text_view.Text += "CRC8.getCRC(String): " + b_ret.ToString() + "\n";

            b_ret = CRC8.getCRC(aa);
            text_view.Text += "CRC8.getCRC(byte[]): " + b_ret.ToString() + "\n";

            text_view.Text += "CRC8.getCRC(ASCII.GetBytes): ";
            text_view.Text += CRC8.getCRC(System.Text.Encoding.ASCII.GetBytes("ABC123XYZ")).ToString() + "\n";
        }

这是输出(API 18 即 Android 4.3):

  • CRC8.getCRC(字符串):65
  • CRC8.getCRC(byte[]): 125
  • CRC8.getCRC(ASCII.GetBytes):65

您能找到我们的代码等之间的任何区别吗?我希望这有帮助。

于 2013-09-15T11:02:53.493 回答