如何使用javafxpackager和x86_64 Windows exe在jni中理解和解决EXCEPTION_ACCESS_VIOLATION?

时间:2019-02-27 18:42:01

标签: java java-native-interface x86-64 access-violation

我正在为使用rhvoice语音合成器的Java应用程序开发安装程序打包程序,该程序不需要Windows上的管理员特权(因此我不能使用sapi版本)。

要解决这个问题,当从jar文件中使用java.exe执行Java应用程序时,我使用了带有正式最小fixes的Andoid jni代码,并且在x86和x86_64体系结构上都可以很好地工作。

但是,当我使用javafxpackager或例如packr(它们使用jvm.dll进行工作)制作Windows exe应用程序时,x86版本可以正常工作,但x86_64会因Java EXCEPTION_ACCESS_VIOLATION而停止:

# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff83fa36b2d, pid=110316, tid=0x0000000000019f60
#
# JRE version: OpenJDK Runtime Environment (8.0_201-b09) (build 1.8.0_201-1-ojdkbuild-b09)
# Java VM: OpenJDK 64-Bit Server VM (25.201-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [RHVoice.64.dll+0x6b2d]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
...
Stack: [0x000000dd61600000,0x000000dd61ad0000],  sp=0x000000dd61acf030,  free space=4924k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [RHVoice.64.dll+0x6b2d]
C  0x000002990001962e

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  com.github.olga_yakovleva.rhvoice.TTSEngine.doGetVoices()[Lcom/github/olga_yakovleva/rhvoice/VoiceInfo;+0
j  com.github.olga_yakovleva.rhvoice.TTSEngine.getVoices()Ljava/util/List;+1
j  com.github.olga_yakovleva.rhvoice.Test.go()V+17
j  com.github.olga_yakovleva.rhvoice.Test.main([Ljava/lang/String;)V+34
v  ~StubRoutines::call_stub

几年前(2014-2015年),此方法在Windows 7和Windows 8两种体系结构上均无错误,但是旧版本在Windows 10上无法正常工作,并使用Visual Studio 2017重新编译。

我如何检测此类错误异常的原因。我如何设置调试环境来对此进行研究。

当我更改Java版本(Oracle或非常规Windows构建openjdk),编译器(vs2015 / 2017)或构建环境操作系统(win7或win10)时,有时问题出在x86版本的打包程序上,并且内部之间的异常地址已更改rhvoice库或Java。

0 个答案:

没有答案