- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常遇到这个错误...尤其是在访问一个类的私有(private)方法时...真的不知道这是怎么回事...我也无法从谷歌中找到太多解释..
我只是在这里发布了一个导致异常的例子:
我有一个 SyncAdapter,这是导致崩溃的 onPerformSync 方法..
@Override
@SuppressLint("NewApi")
public void onPerformSync(Account account, Bundle extras, String authority,
ContentProviderClient provider, SyncResult syncResult) {
// some code...
HmacSHA224 mac = new HmacSHA224(accessToken.getBytes());
JSONArray entries = new JSONArray();
JSONArray hashes = null;
String lastName = null;
// some other code
}
HmacSHA224 是我定义的自定义类,如下所示:
public class HmacSHA224 {
private SHA224 mMessageDigest;
private byte[] mKey;
public HmacSHA224(byte[] key) {
mMessageDigest = new SHA224();
mKey = key;
}
public byte[] hash(byte[] message) {
int blockSize = 64;
int digestSize = 28;
if (mKey.length > blockSize) {
mKey = mMessageDigest.digest(mKey);
}
if (mKey.length < blockSize) {
byte[] k = new byte[blockSize];
System.arraycopy(mKey, 0, k, 0, mKey.length);
mKey = k;
}
byte[] o = new byte[blockSize + digestSize];
byte[] i = new byte[blockSize + message.length];
for (int n = 0; n < blockSize; n++) {
o[n] = (byte)(mKey[n] ^ 0x5c);
i[n] = (byte)(mKey[n] ^ 0x36);
}
System.arraycopy(message, 0, i, blockSize, message.length);
System.arraycopy(mMessageDigest.digest(i), 0, o, blockSize, digestSize);
return mMessageDigest.digest(o);
}
和 SHA224 类:
public final class SHA224 extends MessageDigestSpi {
private static int[] H = { some values };
private static int[] K = { some values };
private ByteBuffer dataBuf = ByteBuffer.allocate(64);
private int length = 0;
private int[] h = H.clone();
private void processChunk() {
dataBuf.rewind();
int[] w = new int[64];
for (int i = 0; i < 16; i++)
w[i] = dataBuf.getInt();
dataBuf.clear();
for (int i = 16; i < 64; i++) {
int s0 = w[i - 15];
s0 = ((s0 >>> 7) | (s0 << 25)) ^ ((s0 >>> 18) | (s0 << 14)) ^ (s0 >>> 3);
int s1 = w[i - 2];
s1 = ((s1 >>> 17) | (s1 << 15)) ^ ((s1 >>> 19) | (s1 << 13)) ^ (s1 >>> 10);
w[i] = w[i - 16] + s0 + w[i - 7] + s1;
}
int a = this.h[0], b = this.h[1], c = this.h[2], d = this.h[3],
e = this.h[4], f = this.h[5], g = this.h[6], h = this.h[7];
for (int i = 0; i < 64; i++) {
int s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
int maj = (a & b) ^ (a & c) ^ (b & c);
int t2 = s0 + maj;
int s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
int ch = (e & f) ^ ((~e) & g);
int t1 = h + s1 + ch + K[i] + w[i];
h = g;
g = f;
f = e;
e = d + t1;
d = c;
c = b;
b = a;
a = t1 + t2;
}
this.h[0] += a;
this.h[1] += b;
this.h[2] += c;
this.h[3] += d;
this.h[4] += e;
this.h[5] += f;
this.h[6] += g;
this.h[7] += h;
}
@Override
protected byte[] engineDigest() {
long bitLength = length * 8L;
engineUpdate((byte) 0x80);
for (; (length + 8) % 64 != 0;)
engineUpdate((byte) 0);
dataBuf.putLong(bitLength);
processChunk();
ByteBuffer result = ByteBuffer.allocate(28);
for (int i = 0; i < 7; i++)
result.putInt(h[i]);
engineReset();
return result.array();
}
@Override
protected void engineReset() {
dataBuf.clear();
length = 0;
h = H.clone();
}
@Override
protected void engineUpdate(byte src) {
dataBuf.put(src);
length += 1;
if (length % 64 == 0)
processChunk();
}
@Override
protected void engineUpdate(byte[] src, int offset, int count) {
for (int i = offset; i < offset + count; i++)
engineUpdate(src[i]);
}
public byte[] digest(byte[] input) {
engineUpdate(input, 0, input.length);
return engineDigest();
}
}
我发现当我启动 mac 值时发生了崩溃.. 错误跟踪到
VFY: rejected Lim/com/example/utils/SHA224;.engineDigest ()
更新:
我有以下日志:
09-03 14:38:59.841 25084-25134/com.example.android:sync W/dalvikvm﹕ VFY: invoke type does not match method type of Lcom/example/android/utils/SHA224;.processChunk
09-03 14:38:59.841 25084-25134/com.example.android:sync W/dalvikvm﹕ VFY: rejecting opcode 0x6f at 0x002b
09-03 14:38:59.841 25084-25134/com.example.android:sync W/dalvikvm﹕ VFY: rejected Lcom/example/android/utils/SHA224;.engineDigest ()[B
09-03 14:38:59.841 25084-25134/com.example.android:sync W/dalvikvm﹕ Verifier rejected class Lcom/example/android/utils/SHA224;
09-03 14:38:59.841 25084-25134/com.example.android:sync W/dalvikvm﹕ threadid=23: thread exiting with uncaught exception (group=0x415daba8)
09-03 14:38:59.841 25084-25134/com.example.android:sync W/System.err﹕ java.lang.VerifyError: com/example/android/utils/SHA224
09-03 14:38:59.841 25084-25134/com.example.android:sync W/System.err﹕ at com.example.android.utils.HmacSHA224.<init>(HmacSHA224.java:5)
09-03 14:38:59.841 25084-25134/com.example.android:sync W/System.err﹕ at com.example.android.adapters.SyncAdapter.onPerformSync(SyncAdapter.java:71)
09-03 14:38:59.841 25084-25134/com.example.android:sync W/System.err﹕ at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259)
09-03 14:38:59.851 25084-25134/com.example.android:sync E/AndroidRuntime﹕ FATAL EXCEPTION: SyncAdapterThread-1
Process: com.example.android:sync, PID: 25084
java.lang.VerifyError: com/example/android/utils/SHA224
at com.example.android.utils.HmacSHA224.<init>(HmacSHA224.java:5)
at com.example.android.adapters.SyncAdapter.onPerformSync(SyncAdapter.java:71)
at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259)
再次更新所以问题出在 processChunk() 方法上,当更改为 protected (而不是私有(private))时,崩溃消失了。但!!!我想知道为什么它会这样......为什么我不能将某些方法保持私有(private)并在同一个类中调用......
最佳答案
对于为什么会发生这种情况还没有明确的答案,但这是我对正在发生的事情和调查方向的分析:
日志显示类 SHA224
的字节码验证在尝试将其加载到 VM 内存时失败:
Verifier rejected class Lcom/example/android/utils/SHA224;
细节告诉我们,验证失败是因为调用了processChunk()
的父类实现,MessageDigestSpi
父类中不存在:
VFY: invoke type does not match method type of Lcom/example/android/utils/SHA224;.processChunk
VFY: rejecting opcode 0x6f at 0x002b
VFY: rejected Lcom/example/android/utils/SHA224;.engineDigest ()[B
(操作码0x6F
用于调用 super 方法on Dalvik)
所以看起来您的代码中对 processChunk()
的调用被编译为 super.processChunk()
,这自然无法在加载时解析。为什么,我不能说,这可能是构建工具链中的一个错误,特别是因为你说只要将 processChunk()
方法范围更改为 protected
就可以正确编译它.
进一步尝试调查的事情:
this.processChunk()
而不是 processChunk()
(这应该是相同的但会提示编译器问题)我在我的环境中尝试了您的代码(SDK 工具 23.0.2,平台工具 20,目标最低 API 8,在 4.4/Dalvik 上运行)我没有遇到这个问题,即使输入了摘要代码在单独的进程中运行的同步适配器。所以我肯定会检查您的建筑环境。
这不会解决问题的根源,但对于 Android 上的哈希,您宁愿使用 native API :
MessageDigest sha224 = MessageDigest.getInstance("SHA-224");
// etc
它会在不提供 SHA-224 哈希算法的设备上失败...
关于java - W/dalvikvm:VFY : invoke type does not match method type of,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25639449/
验证邮箱的正则表达式 var ePattern = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; 或者
我正在学习正则表达式并认为我开始掌握了。但是…… 我试图拆分一个字符串,我需要帮助来理解这样一个简单的事情: String input = "abcde"; System.out.println("[
我是初学者。我不知道为什么?我正在使用 Code::Blocks。请阅读以下代码: 如果 q=' W ',则打印出 W。 如果 q=" W ",则打印出 $。 最佳答案 文字 "W" 不是单个 cha
我在 BigQuery Reference 或 re2 wiki 中都找不到答案。 在 BigQuery Reference 中 Regex 部分的所有示例中,每个 regex 之前都有一个“r”,但
当我按“W 或 w”但仅一次时,我想让我的矩形/字符移动“X px”。按住“W”和“w”时不继续移动。我尝试使用一个变量创建一个“Key Released”函数,该变量在按下“W 或 w”时会发生变化
%w[ ] Non-interpolated Array of words, separated by whitespace %W[ ] Interpolated Array of words
我使用 vim。在我曾经使用过的每台机器上,“w”都尊重标点符号。如果我按“w”,我会前进到一个词的结尾。 如果是句点分隔词,我将移至下一个句点。 然而,在特定的 vim 安装中,'w' 被解释为 '
(\w+)?有什么区别吗和 (\w*)在正则表达式中? 似乎是一样的,不是吗? 最佳答案 (\w+)?和 (\w*)两者匹配相同(0..+inf 单词字符) 但是,有一点不同: 在第一种情况下,如果正
在 Ruby 中 %w(don matt james) 和 %w[don matt james] 有区别吗? 使用 Ruby 控制台,它们都输出一个数组,每个单词作为一个元素。我很好奇为什么有多种方法
我真的很想帮助您决定字母表中所有单词的语言是否{0,1}不能从两边以同样的方式读取,{ w | w <> wR } , 是一种上下文无关语言(即可以转化为特定的语法规则)。 我试图通过抽水引理证明它不
这是我的 Xml 文档(小片段)。
:q 和 :Q 也是如此。我几乎总是不会足够快地放弃转变,看到 :Q 和 :W 无论如何都没有被使用,我认为让它们像小写字母一样做会很好。 最佳答案 黑客是通过 :cmap或 :cabb ,但这些都有
我对/\w\b\w/感到困惑。我认为它应该匹配“we we”中的“e w”,因为: \w 是单词字符,即“e” \b 是单词 broundary,它是 ""(空格) \w 是另一个词是“w” 所以匹配
在 Linux 中,我的目录中有一个名为 test2 的文件,该文件是我使用 touch 命令创建的。 当我运行命令时 find . –name “*test*” -ls 它不会给我错误,但是当我运行
我想把一个句子分成单词和单词之间的部分(我称之为定界符)。 sentence = "First-tea,-then-coffee!" => "First-tea,-then-coffee!" word
我正在查看 Ruby 的文档。我对使用 %w() 还是 %W() 感到困惑(后面的 W 是大写的)。两者有什么区别?你能给我指点一些文档吗? 最佳答案 当大写时,数组由插入的字符串构成,就像在双引号字
有什么区别? 最佳答案 %w 引用像单引号 ''(没有变量插值,转义序列更少),而 %W 引用像双引号 ""。 irb(main):001:0> foo="hello" => "hello" irb(
这是运行 XQueries 之前的 XML 文档示例: ... 1.7 ****
除非我为 TableTypeCarrier 模板类包含一个复制构造函数,否则使用 clang(但不是 gcc)构建时,以下代码会在运行时崩溃吗?如果我包含该复制构造函数,为什么我在使用 gcc 构建时
尝试: time perl -E '$x="a" x 100000; $x =~ /[\w\W]+x/i' 将运行很长时间(在我的笔记本上20秒)。没有/i,例如 time perl -E '$x=
我是一名优秀的程序员,十分优秀!