Ensemble.Tofino运行报错Unexpected java bridge exception的解决

作为 Visual Studio 插件的 Flex 开发工具,Ensemble 公司的 Tofino 确实很吸引人,包含编译环境的安装文件总共才 122M,比起 Flex Builder 要不少。而且,对于熟悉了 VS 开发环境的.Net 程序员,用这样的插件来做 Flex 开发方便了很多。

从官网下载安装文件,选择 122M 的包含开发编译环境的安装包下载。关闭 Visual Studio,安装成功后开启 Visual Studio,正常情况下 Flex 项目会出现在新建项目的页面上。新建一个 Flex 工程,如果你机器的 java 环境配置不正确,就会跟我一样,出现 Ensemble.Tofino.Plugin.Support.FlexJavaBridgeException: Unexpected java bridge exception 的错误提示(虽然此时没有编译运行工程,但是会检查出来)。如果编译运行项目,则会报如下详细错误:

  1. unexpected exception: Ensemble.Tofino.Plugin.Support.FlexJavaBridgeException: Unexpected java bridge exception.   
  2. Tofino version: 2.2010.1.7   
  3. Microsoft? Visual Studio? 2008 9.0.30729.1 built by: SP   
  4. Using JVM: C:\Program Files\Java\j2re1.4.2_19/bin/client/jvm.dll   
  5. OS: Windows XP (Microsoft Windows NT 5.1.2600 Service Pack 3) ---> System.Runtime.InteropServices.SEHException: 外部组件发生异常。   
  6.    在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.EnsureInitialized()   
  7.    在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.InvokedUnLockedAction(JavaAction action)   
  8.    --- 内部异常堆栈跟踪的结尾 ---   
  9.    在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.InvokedUnLockedAction(JavaAction action)   
  10.    在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.InvokedLockedAction(JavaAction action)   
  11.    在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.StartBuild(String projectDir, LogCallback logCallback, ProgressCallback progressCallback)   
  12.    在 Ensemble.Tofino.Plugin.Compiler.FlexBuilder.Build()   
  13.    在 Ensemble.Tofino.Plugin.Project.FlexProject.InvokeMsBuild(String target)        -1  0   FlexApplication1  
unexpected exception: Ensemble.Tofino.Plugin.Support.FlexJavaBridgeException: Unexpected java bridge exception.
Tofino version: 2.2010.1.7
Microsoft? Visual Studio? 2008 9.0.30729.1 built by: SP
Using JVM: C:\Program Files\Java\j2re1.4.2_19/bin/client/jvm.dll
OS: Windows XP (Microsoft Windows NT 5.1.2600 Service Pack 3) ---> System.Runtime.InteropServices.SEHException: 外部组件发生异常。
   在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.EnsureInitialized()在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.InvokedUnLockedAction(JavaAction action)
   --- 内部异常堆栈跟踪的结尾 ---
   在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.InvokedUnLockedAction(JavaAction action)
   在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.InvokedLockedAction(JavaAction action)
   在 Ensemble.Tofino.Plugin.Support.FlexJavaBridge.StartBuild(String projectDir, LogCallback logCallback, ProgressCallback progressCallback)
   在 Ensemble.Tofino.Plugin.Compiler.FlexBuilder.Build()在 Ensemble.Tofino.Plugin.Project.FlexProject.InvokeMsBuild(String target)		-1	0	FlexApplication1

从上面的错误信息可以看出,是 Tofino 的 dll 在配置 java 环境时出错,找到这一行:

Using JVM: C:\Program Files\Java\j2re1.4.2_19/bin/client/jvm.dll

取到的是 jre 的路径,那么应该是 jre 中 bin 路径错误,需要 java.dll 所在的目录,而这里缺少 bin 目录。那 Tofino 是怎么取到 java 环境的路径呢?我么来看下 Tofino 的安装目录。

在 Tofino 安装目录下的 sdks\3.2.0\bin 目录中,有个 jvm.config 文件,打开找到如下内容:

  1. #   
  2. # VM configuration   
  3. #   
  4. # Where to find JVM, if {java.home}/jre exists then that JVM is used   
  5. # if not then it must be the path to the JRE itself   
  6. #   
  7. # If no java.home is specified a VM is located by looking in these places in this   
  8. # order:   
  9. #   
  10. #  1) JAVA_HOME environment variables (same rules as java.home above)   
  11. #  2) bin directory for java.dll (windows) or lib/<ARCH>/libjava.so (unix)   
  12. #  3) ../jre    
  13. #  4) registry (windows only)   
  14. #   
  15.   
  16. java.home=  
#
# VM configuration
#
# Where to find JVM, if {java.home}/jre exists then that JVM is used
# if not then it must be the path to the JRE itself
#
# If no java.home is specified a VM is located by looking in these places in this
# order:
#
#  1)JAVA_HOME environment variables (same rules as java.home above)
#  2)bin directory for java.dll (windows) or lib/<ARCH>/libjava.so (unix)
#  3) ../jre 
#  4)registry (windows only)
#

java.home=

注释中已经明确说明了,jvm 运行环境的检查先后顺序

1. 环境变量中 JAVA_HOME 指向的位置;

2.java.dll(Windows) 或 lib/<arch>/libjava.so(unix) 的位置;

3.jre 的位置;

4. 配置文件中指向的位置 (windows).

java.home= 就可以直接配置 jvm 的实际位置,即 java.dll 所在目录。

查看我的机器上的环境变量,JAVA_HOME 指向的 jre 为安装目录的根目录,应该改为包含 bin 的目录。修改JAVE_HOME 的路径,比如 C:\Program Files\Java\jre6\bin。重新启动 Visual Studio,编译运行 Flex 项目,OK,一切正常!

如果有朋友遇到同样的报错信息,参考以上内容修改即可。祝大家好运!