我刚刚发现了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;
}
}
}
}
也许这有帮助。堆栈跟踪显示......
答案 0 :(得分:2)
这确实是dot42编译器中的一个错误,行:
int crcByte = Convert.ToInt16(...)内部结束为short,比调用int上的ToString为16位,传递16位值,而不将其向上转换为32位,从而导致验证错误。
我们(dot42编译器团队)为此问题创建了一个案例/票证。
作为解决方法,您可以将代码更改为: int crcByte = Convert.ToInt32(...)
希望这有帮助。
答案 1 :(得分:1)
检查一些可能的问题:
我在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):
您能发现我们的代码之间有什么区别吗? 我希望这会有所帮助。