`
dengyigang
  • 浏览: 7926 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

JNative 调用 dll时候,JDK报“Java VM”错误

阅读更多
在我调用JNative的时候,
动态库是delphi写的,定义如下

Function read_qh_ws_cpu(isComPort,isReaderType:string;
                       var Cardtype:Pchar;
                       var ReadCard_data:Pchar;
                       var Read_Otherdata:Pchar):integer;stdcall;
                        far;external 'IC_WS_CPU.dll'name 'read_qh_ws_cpu';

java中通过JNative调用,实现如下:
/**
*
*/
package jnative;

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
import org.xvolks.jnative.Type;

import java.lang.reflect.*; 
import java.io.*;

/**
* @author Administrator
*
*/
public class ReadCard {

static JNative Something = null;
static Pointer pointer;

public String strCom="01";
public String strReaderType="1";
public Pointer pCardtype;
public Pointer pReadCard_data;
public Pointer pRead_Otherdata;


public int getInfoReadCard(    String  sCom,
               String  sReaderType,
               Pointer pCardtype,
               Pointer pReadCard_data,
               Pointer pRead_Otherdata)  
                     throws NativeException, IllegalAccessException
{

try{
if(Something == null)
  {
//分配指针变量的内存大小
pCardtype           = new Pointer(MemoryBlockFactory.createMemoryBlock(10));

pReadCard_data   = new Pointer(MemoryBlockFactory.createMemoryBlock(1024));
pRead_Otherdata  = new Pointer(MemoryBlockFactory.createMemoryBlock(20480));

pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(10+1024+20480));



Something = new JNative("IC_WS_CPU.dll", "read_qh_ws_cpu");

// 指定返回参数的类型    dll文件中SCHelp_HexStringToBytes函数返回类型定义是“long”型
Something.setRetVal(Type.INT);
  }

int i=0;
Something.setParameter(i++,Type.STRING, sCom);
Something.setParameter(i++,Type.STRING,sReaderType);


Something.setParameter(i++,pCardtype);
Something.setParameter(i++,pReadCard_data);
Something.setParameter(i++,pRead_Otherdata);
System.out.println("调用的DLL文件名为:"+Something.getDLLName());
System.out.println("调用的方法名为:"+Something.getFunctionName());
//传值
Something.invoke();//调用方法
return Integer.parseInt(Something.getRetVal());
}finally{
if(Something!=null){
Something.dispose();//释放
}
}
}


/**
* @param args
*/
public static void main(String[] args) throws NativeException, IllegalAccessException
{
// TODO Auto-generated method stub

ReadCard rc = new ReadCard();
int result = rc.getInfoReadCard(rc.strCom,rc.strReaderType,rc.pCardtype,rc.pReadCard_data,rc.pRead_Otherdata);
System.err.println("转换成功的字节数为:"+result);
//TestCallback.runIt();

}

}



但是运行后,报如下log错误:
请帮忙分析一下!谢谢!
邮箱dengyigang@126.com


------------------------------------------------------------------------------------
#
# An unexpected error has been detected by Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x02e37b1a, pid=4008, tid=456
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0-beta2-b86 mixed mode, sharing)
# Problematic frame:
# C  [IC_WS_CPU.dll+0x7b1a]
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

---------------  T H R E A D  ---------------

Current thread (0x003f5800):  JavaThread "main" [_thread_in_native, id=456]

siginfo: ExceptionCode=0xc0000005, reading address 0x03be1030

Registers:
EAX=0x010d0159, EBX=0x00000001, ECX=0x00000000, EDX=0x008ff9bc
ESP=0x008ff974, EBP=0x008ff9bc, ESI=0x010d0159, EDI=0x02b10ed8
EIP=0x02e37b1a, EFLAGS=0x00010202

Top of Stack: (sp=0x008ff974)
0x008ff974:   008ff9e4 000a71b8 00000000 00000000
0x008ff984:   02e7e971 0090fdc8 02e7eb70 008ff9e4
0x008ff994:   00000000 00000000 00000000 00000000
0x008ff9a4:   00000000 00000000 00000000 00000000
0x008ff9b4:   00000000 00000000 00000000 00000000
0x008ff9c4:   00000000 00000000 00000000 00000000
0x008ff9d4:   00000000 00000000 00000000 00000000
0x008ff9e4:   0090fc08 100047c3 02b10ed8 02b7ccf0

Instructions: (pc=0x02e37b1a)
0x02e37b0a:   76 f4 3b f3 7d 0a 8b c5 e8 81 c3 ff ff eb 17 4e
0x02e37b1a:   80 7c 37 ff 20 76 f8 55 8b ce 2b cb 41 8b d3 8b


Stack: [0x008c0000,0x00910000),  sp=0x008ff974,  free space=254k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [IC_WS_CPU.dll+0x7b1a]

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  org.xvolks.jnative.JNative.nInvoke(I)V+0
j  org.xvolks.jnative.JNative.invoke()V+9
j  jnative.ReadCard.getInfoReadCard(Ljava/lang/String;Ljava/lang/String;Lorg/xvolks/jnative/pointers/Pointer;Lorg/xvolks/jnative/pointers/Pointer;Lorg/xvolks/jnative/pointers/Pointer;)I+216
j  jnative.ReadCard.main([Ljava/lang/String;)V+29
v  ~StubRoutines::call_stub

---------------  P R O C E S S  ---------------

Java Threads: ( => current thread )
  0x02ae4800 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=3536]
  0x02ae2000 JavaThread "CompilerThread0" daemon [_thread_blocked, id=3328]
  0x02ae0c00 JavaThread "Attach Listener" daemon [_thread_blocked, id=2808]
  0x02afdc00 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=3772]
  0x02aa1800 JavaThread "Finalizer" daemon [_thread_blocked, id=3336]
  0x02a9d000 JavaThread "Reference Handler" daemon [_thread_blocked, id=3896]
=>0x003f5800 JavaThread "main" [_thread_in_native, id=456]

Other Threads:
  0x02a94000 VMThread [id=2172]
  0x02ae6000 WatcherThread [id=2076]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

Heap
def new generation   total 960K, used 615K [0x229d0000, 0x22ad0000, 0x22eb0000)
  eden space 896K,  68% used [0x229d0000, 0x22a69e50, 0x22ab0000)
  from space 64K,   0% used [0x22ab0000, 0x22ab0000, 0x22ac0000)
  to   space 64K,   0% used [0x22ac0000, 0x22ac0000, 0x22ad0000)
tenured generation   total 4096K, used 0K [0x22eb0000, 0x232b0000, 0x269d0000)
   the space 4096K,   0% used [0x22eb0000, 0x22eb0000, 0x22eb0200, 0x232b0000)
compacting perm gen  total 12288K, used 547K [0x269d0000, 0x275d0000, 0x2a9d0000)
   the space 12288K,   4% used [0x269d0000, 0x26a58e70, 0x26a59000, 0x275d0000)
    ro space 8192K,  67% used [0x2a9d0000, 0x2af35520, 0x2af35600, 0x2b1d0000)
    rw space 12288K,  56% used [0x2b1d0000, 0x2b89c188, 0x2b89c200, 0x2bdd0000)

Dynamic libraries:
0x00400000 - 0x00423000 D:\MyEclipse 6.0\jdk1.6.0\bin\javaw.exe
0x7c920000 - 0x7c9b3000 C:\WINDOWS\system32\ntdll.dll
0x7c800000 - 0x7c91e000 C:\WINDOWS\system32\kernel32.dll
0x77da0000 - 0x77e49000 C:\WINDOWS\system32\ADVAPI32.dll
0x77e50000 - 0x77ee2000 C:\WINDOWS\system32\RPCRT4.dll
0x77fc0000 - 0x77fd1000 C:\WINDOWS\system32\Secur32.dll
0x77d10000 - 0x77da0000 C:\WINDOWS\system32\USER32.dll
0x77ef0000 - 0x77f39000 C:\WINDOWS\system32\GDI32.dll
0x76300000 - 0x7631d000 C:\WINDOWS\system32\IMM32.DLL
0x62c20000 - 0x62c29000 C:\WINDOWS\system32\LPK.DLL
0x73fa0000 - 0x7400b000 C:\WINDOWS\system32\USP10.dll
0x7c340000 - 0x7c396000 D:\MyEclipse 6.0\jdk1.6.0\jre\bin\msvcr71.dll
0x6d7f0000 - 0x6da2f000 D:\MyEclipse 6.0\jdk1.6.0\jre\bin\client\jvm.dll
0x76b10000 - 0x76b3a000 C:\WINDOWS\system32\WINMM.dll
0x6d310000 - 0x6d318000 D:\MyEclipse 6.0\jdk1.6.0\jre\bin\hpi.dll
0x76bc0000 - 0x76bcb000 C:\WINDOWS\system32\PSAPI.DLL
0x6d7a0000 - 0x6d7ac000 D:\MyEclipse 6.0\jdk1.6.0\jre\bin\verify.dll
0x6d3a0000 - 0x6d3bf000 D:\MyEclipse 6.0\jdk1.6.0\jre\bin\java.dll
0x6d7e0000 - 0x6d7ef000 D:\MyEclipse 6.0\jdk1.6.0\jre\bin\zip.dll
0x10000000 - 0x100cd000 D:\MyEclipse 6.0\jdk1.6.0\jre\bin\JNativeCpp.dll
0x77be0000 - 0x77c38000 C:\WINDOWS\system32\msvcrt.dll
0x02e30000 - 0x02e91000 D:\mywork\project\java\MyCommText\bin\qh\IC_WS_CPU.dll
0x770f0000 - 0x7717b000 C:\WINDOWS\system32\oleaut32.dll
0x76990000 - 0x76acd000 C:\WINDOWS\system32\ole32.dll
0x77bd0000 - 0x77bd8000 C:\WINDOWS\system32\version.dll
0x02ea0000 - 0x02f14000 D:\mywork\project\java\MyCommText\bin\qh\WSCPU.dll
0x02f20000 - 0x02f43000 D:\mywork\project\java\MyCommText\bin\qh\WDCRWV.DLL
0x02f50000 - 0x02f76000 D:\mywork\project\java\MyCommText\bin\qh\WDPublic.DLL
0x02f80000 - 0x02f88000 D:\mywork\project\java\MyCommText\bin\qh\XjCpuPre.dll
0x02f90000 - 0x02f98000 D:\mywork\project\java\MyCommText\bin\qh\PCSC.dll
0x02fa0000 - 0x02faa000 D:\mywork\project\java\MyCommText\bin\qh\Mdes.dll
0x73d30000 - 0x73e2e000 C:\WINDOWS\system32\MFC42.DLL
0x72360000 - 0x7237a000 C:\WINDOWS\system32\WinSCard.dll
0x76f20000 - 0x76f28000 C:\WINDOWS\system32\WTSAPI32.dll
0x762d0000 - 0x762e0000 C:\WINDOWS\system32\WINSTA.dll
0x5fdd0000 - 0x5fe25000 C:\WINDOWS\system32\NETAPI32.dll
0x02fb0000 - 0x02fb8000 D:\mywork\project\java\MyCommText\bin\qh\CPU.dll
0x5d170000 - 0x5d20a000 C:\WINDOWS\system32\comctl32.dll
0x61be0000 - 0x61bed000 C:\WINDOWS\system32\MFC42LOC.DLL

VM Arguments:
java_command: jnative.ReadCard
Launcher Type: SUN_STANDARD

Environment Variables:
JAVA_HOME=D:\MyEclipse 6.0\jdk1.6.0
CLASSPATH=.;D:\MyEclipse 6.0\Tomcat 6.0\common\lib;D:\MyEclipse 6.0\jdk1.6.0\bin;D:\MyEclipse 6.0\jdk1.6.0\lib;D:\MyEclipse 6.0\jdk1.6.0\lib\dt.jar;D:\MyEclipse 6.0\jdk1.6.0\lib\tools.jar;D:\MyEclipse 6.0\jdk1.6.0\lib\comm.jar
PATH=C:\Program Files\Borland\Delphi7\Bin;C:\Program Files\Borland\Delphi7\Projects\Bpl\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;c:\documents and settings\administrator\桌面\dws\dws\lib\;D:\mywork\project\java\MyCommText\bin\qh\;C:\Program Files\StormII\Codec;C:\Program Files\StormII;D:\Program Files\UltraEdit_V14\;D:\Program Files\UltraEdit_V14\UltraCompare
USERNAME=Administrator
OS=Windows_NT
PROCESSOR_IDENTIFIER=x86 Family 6 Model 14 Stepping 8, GenuineIntel



---------------  S Y S T E M  ---------------

OS: Windows XP Build 2600 Service Pack 3

CPU:total 1 family 6, cmov, cx8, fxsr, mmx, sse, sse2

Memory: 4k page, physical 1046640k(190404k free), swap 2518656k(1599712k free)

vm_info: Java HotSpot(TM) Client VM (1.6.0-beta2-b86) for windows-x86, built on Jun  2 2006 00:36:31 by "java_re" with unknown MS VC++:1310


------------------------------------------------------------------------------------
分享到:
评论
2 楼 hyint 2009-02-10  
非常谢谢你的文章与共享!我也在些这个,发现指针内存空间创建后,point.getAsString()。会发现我构建指针的字符串后面还有一些乱码的东西,不知道何解?
1 楼 dengyigang 2008-08-31  
哈哈~~~
问题解决了。
原因是:JVM这个Java VM: Java HotSpot(TM) Client VM (1.6.0-beta2-b86 mixed mode, sharing)
版本的BUG,
后来我到www.sun.comwww.sun.com

下载了jre 1.6.10更新包,正式发布版,不是测试版,
就再也不报以上错误了。
看来,大家在开发中,一定要主意 jdk的版本。尽量使用正式发布版,测试版确实有些地方有问题。

相关推荐

    在Java程序中使用JNative调用dll文件

    在Java程序中调用DLL(动态链接库)文件通常是通过JNI(Java Native Interface)来实现的,而JNative是JNI的一个封装库,它提供了一种更简洁的方式来调用C/C++编写的本地代码。这篇博客文章可能介绍了如何利用...

    简单jnative调用dll例子(含dll代码)

    首先定义Java中的JNI接口,然后使用`javah`生成C/C++的头文件,接着编写并编译DLL,最后在Java程序中加载并调用DLL函数。这个过程虽然复杂,但是一旦熟悉了,就能灵活地在Java和本地代码之间建立桥梁,充分利用两者...

    java利用jnative调用DLL.txt

    ### Java通过JNative调用DLL的关键知识点 #### JNative简介 JNative是一个强大的Java库,允许Java应用程序直接调用本地动态链接库(DLL)或共享库。它为开发者提供了一个简单而灵活的方式来集成本地代码与Java环境...

    jnative框架调用dll动态库-简单demo(带dll文件).zip

    本篇文章将详细介绍如何使用jnative框架在Java中调用DLL动态库,并提供一个简单的示例。 首先,理解jnative框架的核心概念。jnative是一个纯Java库,它提供了一种简单的方式来调用C和C++的函数,无需编写JNI头文件...

    JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用

    标题中的“JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用”涉及到的是Java平台下通过JNI(Java Native Interface)的两种实现方式,JNA(Java Native Access)和JNative,来与C/C++编写的动态链接库(DLL)进行交互...

    java调用DLL:JNative

    在Java项目中,有时候需要调用本地系统的动态链接库(DLL)来实现特定的功能。传统的做法是通过Java Native Interface (JNI)来进行调用,但这往往涉及到复杂的配置和繁琐的过程。为了简化这一过程,JNative框架...

    Java调用DLL例子

    本示例以"Java调用DLL例子"为主题,使用了JNative库作为接口来实现Java调用本地动态链接库。 JNative是一个开源的Java库,它提供了一种方法使得Java程序能够直接调用C/C++编写的函数,从而间接实现了调用DLL的功能...

    YiKaTong.rar_JNative_YiKaTong.r_java jnative dll_jnative api_jna

    3. **yikatong.r.java**:这可能是项目中定义的Java源代码文件,包含了使用JNative调用DLL的Java类。在这个文件中,开发者会定义本地方法签名,然后通过JNative API来实现具体的调用。 4. **jnative.dll**:这是一...

    jnative调用动态库

    标题中的“jnative调用动态库”指的是Java中使用JNative库来调用本地(操作系统级别的)动态链接库(DLL或SO文件)的技术。在Java中,为了与操作系统底层功能进行交互,比如调用C/C++编译的库,我们可以使用Java ...

    Java调用DLL的工具 JNative

    Java调用DLL的工具JNative是为了解决Java应用程序与本地动态链接库(DLL)交互问题而设计的一个开源组件。在传统的Java开发中,如果需要调用非Java编写的库,比如C或C++编译的DLL,通常会使用JNI(Java Native ...

    Java调用DLL源代码

    总结起来,Java调用DLL是Java与本地系统交互的重要手段,通过JNA和JNative,开发者可以在Java应用程序中利用C/C++库的功能,增强程序的能力。这两种技术各有优缺点,选择哪种取决于项目需求和开发者的技术背景。理解...

    JAVA调用DLL方法 JAVA调用DLL方

    ### JAVA调用DLL方法 在跨平台开发领域中,Java作为一种强大的编程语言,因其具有良好的移植性和跨平台性而被广泛使用。然而,在某些特定情况下,我们可能需要调用本地库(例如DLL文件)来实现特定功能或提高性能。...

    java调用DLL文件

    Java本身并不直接支持加载和调用DLL,但可以通过第三方库如JNative来实现这一目标。本文将详细介绍如何在Java中使用JNative库来调用DLL文件。 首先,理解DLL文件:DLL(Dynamic Link Library)是Windows操作系统中...

    JNA.jar-JNative.jar-jinvoke.jar-dll创建-JAVA调用-VC调用

    `TestJNative.java`很可能是使用JNative调用DLL的示例代码。 `jinvoke.jar`是另一个相关的库,它可能提供了一种更简便的Java本地调用方式,简化了JNI的使用。`TestJInvoke.java`可能展示了如何使用jinvoke来调用`...

    jnative 1.3,1.4版本 外加java 调用c++ dll 案例

    本篇文章将深入探讨`jnative` 1.3和1.4版本,以及如何利用它们来实现Java调用C++ DLL的案例。 `jnative` 是一个开源项目,它为Java开发者提供了一种简单的方式来与本地代码(如C++)进行交互。在`jnative` 1.3和1.4...

    JNative用java调用动态库VC++

    Java本地接口(JNI)是Java平台提供的一种原生方法调用机制,允许Java代码与用其他编程语言(如C++)编写的动态链接库(DLL)进行交互。在这个场景中,我们关注的是JNative,一个简化Java调用C/C++库的开源库。 ...

    JAVA如何调用dll:用JNI调用C或C++动态联接库

    总结来说,调用C或C++ DLL文件的主要步骤包括:准备DLL和JNative库,编写Java代码,使用JNative对象创建函数调用,并设置参数及返回值类型。最后,通过`invoke`方法执行函数并处理返回值。这种方法使得Java程序能够...

    java调用dll必备jar包

    Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要应用于Java与本地代码交互,例如在Java中利用C++或C编写的库。本文将详细介绍如何使用Java调用DLL以及所需的必备jar包。 首先,Java并不直接支持DLL的...

    JAVA调用动态链接库DLL之JNative学习源码

    `JNative` 是一个用于Java调用本地代码(如DLL)的开源库,它提供了一个方便的接口,使得Java程序员可以轻松地与动态链接库进行交互。本教程将围绕如何使用`JNative`来调用DLL进行深入讲解。 首先,我们要理解Java...

    JNative Java调用动态链接库jar包

    6. **异常处理**:如果在本地函数执行过程中发生错误,JNative可以将错误信息抛回Java层,作为Java异常处理。 在实际应用中,JNative常用于以下几个场景: - **性能优化**:对于计算密集型任务,本地代码通常比...

Global site tag (gtag.js) - Google Analytics