0

我已经使用 JRE5.0 实现了一个黑莓应用程序,它在任何具有 OS5.0 和 OS6.0 的设备上运行良好
当我尝试在具有 OS 7.0 的 9900 上打开相同的应用程序时,我收到以下错误:

启动 myAppName 时出错:模块“MyAppName-4”有验证错误 3337。(Codfile 版本 78)


其中 myAppName 是应用程序名称(cod 文件的名称)

,如下图所示:

在此处输入图像描述

我检查了事件记录器,这里包含的内容(从旧到新):

  • 一个系统 - VM:LINK MyAppName
  • 一个系统 - VM:VECPs=my.Package.Name.Containing.Screens
  • 系统 - VM:VECCs=oneOfMyScreenClassNames
  • 一个系统 - VM:VECMm=functionInOneOfMyClasses()
  • 模块“MyAppName-4”有验证错误 3337(codfile 版本 78)
  • 链接器错误:MyAppName 的“VerifyError”
  • Error started myAppName: Module 'MyAppName-4' has verification error 3337 (codfile version 78)
    以下是内容:
    在此处输入图像描述
  • E 系统 - JVM:INFOp=2100000a,a='7.0.0.296',o='4.0.0.127',h=7001204
4

1 回答 1

0

对于那些感兴趣的人,我找到了解决方案。

在日志中有:

a System - VM:VECCs=oneOfMyScreenClassNames
a System - VM:VECMm=functionInOneOfMyClasses()

我在日志中指示的整个班级“oneOfMyScreenClassNames”中做了接下来的步骤

以下是步骤:

  1. 如果您从构建 Java Archive (JAR) 文件开始,然后使用 RIM 应用程序编译器 (RAPC) 创建 .cod 文件,请确保在构建 JAR 文件时关闭混淆。RAPC 编译器执行自己的混淆,如果代码已经被混淆,则可能会出现问题。

  2. 删除任何 System.out.* 调用。这些通常在 BlackBerry 智能手机上不起作用,但它们可能会导致验证错误。

  3. 删除未使用的导入语句。

  4. 明确指定每个函数或变量的访问权限。例如,确保将每一项都指定为公共、私有或受保护。

  5. 如果您正在使用 MIDlet,请确保将 MIDlet 类声明为公共的。

  6. 如果 COD 文件已损坏或未正确签名,则可能会出现验证错误。确保您执行干净的重建并重新签署您的应用程序。在 BlackBerry 智能手机上重新安装应用程序。

  7. 注释掉任何不可执行的代码。验证错误可能与主代码文件和库文件的大小有关。如果您注释掉不可执行的代码,文件大小会发生变化,这可能会纠正问题。

  8. 如果您创建了从 RIM 类继承的任何类,请更改您在这些类中创建的任何自定义方法和成员的名称。这确保您没有在内部 RIM 类中命名任何方法或同名成员。

  9. 如果您的应用程序使用的是 BlackBerry® Device Software 3.8 或更高版本,当使用 BlackBerry® Java® Development Environment (BlackBerry JDE) 4.0 之前的版本编译实现 javax.microedition.rms.RecordStore 类的应用程序时,会出现验证错误。如果应用程序使用 RecordStore 类的 addRecordListener 或 removeRecordListener 方法,就会发生这种情况。要解决此问题,请使用 BlackBerry JDE 4.0 或更高版本重新编译应用程序。

  10. BlackBerry® Java® Virtual Machine (BlackBerry JVM) 如何在另一个类的构造函数中直接处理一个类的引用存在问题。下面是一个例子: Class1 class1= new Class1(Class2.class.getName()); 要解决此问题,请不要在构造函数中进行类调用

  11. 从内部类中删除对静态实例变量的引用。有几种方法可以删除这些引用,例如在外部类中为 var 创建 get/set 方法或修改逻辑以将 MyInnerClass 拉出 MyOuterClass。

  12. 构建过程通常使用 javac 命令从 java 源文件编译,然后运行 ​​preverify.exe 文件,然后运行 ​​RAPC。将以下命令行参数添加到 javac 以帮助避免早期版本的 RAPC 中的问题: javac.exe -source 1.3 -target 1.1

  13. 一些很长的方法可能会导致验证错误。通过将这些方法分解为辅助方法,您可以减少验证错误的可能性。

  14. 虽然不太可能,但一些非常长的方法定义(具有 10 个或更多参数)和一些非常长的常量定义(长包结构和/或长名称)也可能导致验证错误。

来源:http ://www.blackberry.com/knowledgecenterpublic/livelink.exe/fetch/2000/348583/800332/832062/Support_-_Preventing_verification_errors.html?nodeid=1499031&vernum=0

PS,我还删除了代码中的“ instanceOf ”用法

于 2012-08-13T14:45:47.170 回答