JNA调用dll时crash了。求教大牛

guigui002000 2013-05-27 09:06:24
这个dll是解调仪厂商给的。
isCorrect和发送命令都正常,可以判断是DataReadPD的问题
文档中的DataReadPD描述如下
DataReadPD(byte ArrayOfData[], int NumberOfBytes) – this function reads the
data returned on port 55000 by the sm125 in response to a command issued with
the SendCommandPD function. The function performs both of the reads
necessary to fully interpret the data returned from the sm125. The function returns
a pointer to an array of bytes, ArrayOfData[], containing the data returned, and an
integer, NumberOfBytes, which indicates the size of the data array. The function
returns a value of 0 on successful completion. The function returns an integer
error code if an error occurs. Integer error codes and their descriptions are listed
later in this document
错误日志

#
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0b0e1c4b, pid=176, tid=4000
#
# Java VM: Java HotSpot(TM) Client VM (11.3-b02 mixed mode windows-x86)
# Problematic frame:
# C [sm125_Comm_Dll.dll+0x1c4b]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#





JNA代码如下


import java.nio.ByteBuffer;

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;


public interface sm125_Comm_Dll extends StdCallLibrary
{
sm125_Comm_Dll INSTANCE = (sm125_Comm_Dll)Native.loadLibrary("sm125_Comm_Dll",sm125_Comm_Dll.class);
public int sm125_Connect(String IPAddress);
public int sm125_Disconnect();
public int SendCommandPD(String command);
// public int DataReadPD(byte[] ArrayOfData , int NumberOfBytes);
public int DataReadPD(ByteBuffer ArrayOfData , int NumberOfBytes);


}

测试的代码如下:
import java.nio.ByteBuffer;

public class Test
{
public static void main(String[] args)
{
int isConnect = 1;//0代表建立成功,1代表连接失败。
String str = "10.0.0.122";
isConnect = sm125_Comm_Dll.INSTANCE.sm125_Connect(str);

System.out.println("isConnect:" + isConnect);//已测试建立连接

String peaks = "#GET_PEAKS_AND_LEVELS";
String convert = null;

// convert = new String(peaks.getBytes("ASCII"));
if(sm125_Comm_Dll.INSTANCE.SendCommandPD("#GET_PEAKS_AND_LEVELS") != 0)
{

System.out.println("SendCommandPD命令运行失败");
return ;
}
else{
System.out.println("发送命令成功");
}

// byte[] returnedData = new byte[10000];
// byte[] returnedData = ByteBuffer.allocateDirect(10000).array();
ByteBuffer returnedData = ByteBuffer.allocate(10000);
int numberOfBytes = 100;

int read = sm125_Comm_Dll.INSTANCE.DataReadPD(returnedData,numberOfBytes);

System.out.println(read);
System.out.println(returnedData);
}
}
...全文
626 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_23877755 2014-12-16
  • 打赏
  • 举报
回复
您好,请问您的问题解决了吗?我也遇见了和您差不多的错误!
我心随意 2013-08-04
  • 打赏
  • 举报
回复
问题解决了没?
l721164739 2013-05-30
  • 打赏
  • 举报
回复
学到了。。。
BadPattern 2013-05-30
  • 打赏
  • 举报
回复
问题解决了?? 分享一下哪边有问题的啊
guigui002000 2013-05-29
  • 打赏
  • 举报
回复
引用 6 楼 dr8737010 的回复:
如果有DataReadPD(byte ArrayOfData[], int NumberOfBytes)这个函数的源码的话就好跟踪了,如果有的话就贴出来让大家看看啊
The function returns a pointer to an array of bytes, ArrayOfData[], containing the data returned, and an integer, NumberOfBytes, which indicates the size of the data array. 文档是这样描述这个函数的,您帮忙看看我的程序有没有理解错?
guigui002000 2013-05-29
  • 打赏
  • 举报
回复
引用 6 楼 dr8737010 的回复:
如果有DataReadPD(byte ArrayOfData[], int NumberOfBytes)这个函数的源码的话就好跟踪了,如果有的话就贴出来让大家看看啊
厂家不提供源码,那要想解决问题,有什么思路? 把所有可用的数据类型试一遍?刚才已经试了char[],String,String[]了 还能有什么办法呢?
BadPattern 2013-05-27
  • 打赏
  • 举报
回复
有问题的代码段: # Problematic frame: # C [sm125_Comm_Dll.dll+0x1c4b] native本地代码出现了问题,sm125_Comm_Dll.dll出了错误 猜测应该是public int DataReadPD(ByteBuffer ArrayOfData , int NumberOfBytes); 传递的参数导致底层计算的时候对内存产生了非法的读写 不知道为什么你把参数byte[]改成了ByteBuffer类型,而且分配了10000个字节,传递进去的numberOfBytes却只有100,你先看一下这块
guigui002000 2013-05-27
  • 打赏
  • 举报
回复
引用 2 楼 fangmingshijie 的回复:
内存不足引起的。
改了内存仍然不行啊~
  • 打赏
  • 举报
回复
内存不足引起的。
guigui002000 2013-05-27
  • 打赏
  • 举报
回复
刚才字数超了。完整错误日志 错误日志 # # An unexpected error has been detected by Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0b0e1c4b, pid=176, tid=4000 # # Java VM: Java HotSpot(TM) Client VM (11.3-b02 mixed mode windows-x86) # Problematic frame: # C [sm125_Comm_Dll.dll+0x1c4b] # # If you would like to submit a bug report, please visit: # http://java.sun.com/webapps/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. # --------------- T H R E A D --------------- Current thread (0x00857800): JavaThread "main" [_thread_in_native, id=4000, stack(0x008f0000,0x00940000)] siginfo: ExceptionCode=0xc0000005, writing address 0x00000064 Registers: EAX=0x00000064, EBX=0x00000000, ECX=0x0000002c, EDX=0x00000000 ESP=0x0093f380, EBP=0x0093f3f8, ESI=0x0093f380, EDI=0x0093f3f8 EIP=0x0b0e1c4b, EFLAGS=0x00010202 Top of Stack: (sp=0x0093f380) 0x0093f380: 0093fb14 00000002 00000000 cccccccc 0x0093f390: cccccccc cccccccc cccccccc cccccccc 0x0093f3a0: cccccccc cccccccc cccccccc cccccccc 0x0093f3b0: cccccccc cccccccc cccccccc cccccccc 0x0093f3c0: cccccccc cccccccc cccccccc cccccccc 0x0093f3d0: cccccccc 0000000a 30303030 30303030 0x0093f3e0: cc003434 30303030 30303030 cccc3434 0x0093f3f0: 0000000a 0000002c 0093f408 1000dc25 Instructions: (pc=0x0b0e1c4b) 0x0b0e1c3b: 00 00 8b 45 f8 e9 34 01 00 00 8b 45 0c 8b 4d fc 0x0b0e1c4b: 89 08 8b 55 fc 52 e8 fa 02 00 00 83 c4 04 89 45 Stack: [0x008f0000,0x00940000], sp=0x0093f380, free space=316k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) C [sm125_Comm_Dll.dll+0x1c4b] C [jna4138342220634322716.dll+0xdc25] C [jna4138342220634322716.dll+0xd546] C [jna4138342220634322716.dll+0x2e5e] C [jna4138342220634322716.dll+0x54ce] j com.sun.jna.Native.invokeInt(JI[Ljava/lang/Object;)I+0 j com.sun.jna.Function.invoke([Ljava/lang/Object;Ljava/lang/Class;Z)Ljava/lang/Object;+333 j com.sun.jna.Function.invoke(Ljava/lang/Class;[Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;+214 j com.sun.jna.Library$Handler.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;+341 j $Proxy0.DataReadPD([BI)I+23 j com.jxdl.dataConnect.Test.main([Ljava/lang/String;)V+83 v ~StubRoutines::call_stub Java frames: (J=compiled Java code, j=interpreted, Vv=VM code) j com.sun.jna.Native.invokeInt(JI[Ljava/lang/Object;)I+0 j com.sun.jna.Function.invoke([Ljava/lang/Object;Ljava/lang/Class;Z)Ljava/lang/Object;+333 j com.sun.jna.Function.invoke(Ljava/lang/Class;[Ljava/lang/Object;Ljava/util/Map;)Ljava/lang/Object;+214 j com.sun.jna.Library$Handler.invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;+341 j $Proxy0.DataReadPD([BI)I+23 j com.jxdl.dataConnect.Test.main([Ljava/lang/String;)V+83 v ~StubRoutines::call_stub --------------- P R O C E S S --------------- Java Threads: ( => current thread ) 0x0ab29000 JavaThread "Low Memory Detector" daemon [_thread_blocked, id=1904, stack(0x0ad70000,0x0adc0000)] 0x0ab24400 JavaThread "CompilerThread0" daemon [_thread_blocked, id=212, stack(0x0ad20000,0x0ad70000)] 0x0ab1f800 JavaThread "Attach Listener" daemon [_thread_blocked, id=1340, stack(0x0acd0000,0x0ad20000)] 0x0ab4a400 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=4052, stack(0x0ac80000,0x0acd0000)] 0x0ab0d400 JavaThread "Finalizer" daemon [_thread_blocked, id=1760, stack(0x0ac30000,0x0ac80000)] 0x0ab08c00 JavaThread "Reference Handler" daemon [_thread_blocked, id=1496, stack(0x0abe0000,0x0ac30000)] =>0x00857800 JavaThread "main" [_thread_in_native, id=4000, stack(0x008f0000,0x00940000)] Other Threads: 0x0ab05400 VMThread [stack: 0x0ab90000,0x0abe0000] [id=1908] 0x0ab34000 WatcherThread [stack: 0x0adc0000,0x0ae10000] [id=884] VM state:not at safepoint (normal execution) VM Mutex/Monitor currently owned by a thread: None Heap def new generation total 960K, used 810K [0x029f0000, 0x02af0000, 0x02ed0000) eden space 896K, 83% used [0x029f0000, 0x02aaa920, 0x02ad0000) from space 64K, 100% used [0x02ae0000, 0x02af0000, 0x02af0000) to space 64K, 0% used [0x02ad0000, 0x02ad0000, 0x02ae0000) tenured generation total 4096K, used 166K [0x02ed0000, 0x032d0000, 0x069f0000) the space 4096K, 4% used [0x02ed0000, 0x02ef9998, 0x02ef9a00, 0x032d0000) compacting perm gen total 12288K, used 3244K [0x069f0000, 0x075f0000, 0x0a9f0000) the space 12288K, 26% used [0x069f0000, 0x06d1b128, 0x06d1b200, 0x075f0000) No shared spaces configured. Dynamic libraries: 0x00400000 - 0x00424000 d:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\bin\javaw.exe 0x7c920000 - 0x7c9b6000 C:\WINDOWS\system32\ntdll.dll 0x7c800000 - 0x7c91e000 C:\WINDOWS\system32\kernel32.dll 0x77da0000 - 0x77e49000 C:\WINDOWS\system32\ADVAPI32.dll 0x77e50000 - 0x77ee3000 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:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\msvcr71.dll 0x6d8b0000 - 0x6db06000 d:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\client\jvm.dll 0x76b10000 - 0x76b3a000 C:\WINDOWS\system32\WINMM.dll 0x6d340000 - 0x6d348000 d:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\hpi.dll 0x76bc0000 - 0x76bcb000 C:\WINDOWS\system32\PSAPI.DLL 0x6d860000 - 0x6d86c000 d:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\verify.dll 0x6d3e0000 - 0x6d3ff000 d:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\java.dll 0x6d8a0000 - 0x6d8af000 d:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\zip.dll 0x68000000 - 0x68036000 C:\WINDOWS\system32\rsaenh.dll 0x77be0000 - 0x77c38000 C:\WINDOWS\system32\msvcrt.dll 0x759d0000 - 0x75a7f000 C:\WINDOWS\system32\USERENV.dll 0x5fdd0000 - 0x5fe25000 C:\WINDOWS\system32\netapi32.dll 0x6d6c0000 - 0x6d6d3000 D:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\jre\bin\net.dll 0x71a20000 - 0x71a37000 C:\WINDOWS\system32\WS2_32.dll 0x71a10000 - 0x71a18000 C:\WINDOWS\system32\WS2HELP.dll 0x719c0000 - 0x719fe000 C:\WINDOWS\system32\mswsock.dll 0x60fd0000 - 0x61025000 C:\WINDOWS\system32\hnetcfg.dll 0x58a00000 - 0x58a07000 C:\WINDOWS\System32\wship6.dll 0x76ef0000 - 0x76f17000 C:\WINDOWS\system32\DNSAPI.dll 0x76f80000 - 0x76f88000 C:\WINDOWS\System32\winrnr.dll 0x76f30000 - 0x76f5c000 C:\WINDOWS\system32\WLDAP32.dll 0x64000000 - 0x64021000 C:\Program Files\Bonjour\mdnsNSP.dll 0x76d30000 - 0x76d48000 C:\WINDOWS\system32\Iphlpapi.dll 0x76f90000 - 0x76f96000 C:\WINDOWS\system32\rasadhlp.dll 0x10000000 - 0x1003d000 C:\Documents and Settings\Administrator\Local Settings\Temp\jna-Administrator\jna4138342220634322716.dll 0x0b0e0000 - 0x0b114000 C:\WINDOWS\system32\sm125_Comm_Dll.dll 0x71a00000 - 0x71a08000 C:\WINDOWS\System32\wshtcpip.dll VM Arguments: jvm_args: -Dfile.encoding=GBK java_command: com.jxdl.dataConnect.Test Launcher Type: SUN_STANDARD Environment Variables: PATH=d:/Program Files/MyEclipse/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client;d:/Program Files/MyEclipse/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin;d:/Program Files/MyEclipse/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/lib/i386;C:\Program Files\Network General\Sniffer Portable\Program;C:\Program Files\Network General\Sniffer Portable\Program\isniffer;C:\Program Files\Network General\Sniffer Portable\ApperaCollector\bin;C:\Program Files\Network General\Sniffer Portable\SupportComponents\bin;C:\Program Files\Network General\Sniffer Portable\CoreComponents\bin;C:\Program Files\Network General\SnifferProtocols\Decode\1.0;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\ThinkPad Wireless LAN Adapter Software;C:\Program Files\Rational\common;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;C:\WINDOWS\system32\WindowsPowerShell\v1.0;D:\Program Files\Java\jdk1.7.0_17\bin;D:\apache-ant-1.9.0\bin;C:\Program Files\MySQL\MySQL Server 5.6\bin USERNAME=Administrator OS=Windows_NT PROCESSOR_IDENTIFIER=x86 Family 6 Model 42 Stepping 7, GenuineIntel --------------- S Y S T E M --------------- OS: Windows XP Build 2600 Service Pack 3 CPU:total 2 (8 cores per cpu, 2 threads per core) family 6 model 10 stepping 7, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, ht Memory: 4k page, physical 2097151k(1152544k free), swap 4194303k(3057944k free) vm_info: Java HotSpot(TM) Client VM (11.3-b02) for windows-x86 JRE (1.6.0_13-b03), built on Mar 9 2009 01:15:24 by "java_re" with MS VC++ 7.1 time: Sun May 26 10:47:48 2013 elapsed time: 0 seconds --
guigui002000 2013-05-27
  • 打赏
  • 举报
回复
嗯,谢谢大牛,我去跟厂家联系下,看可以提供不。
引用 6 楼 dr8737010 的回复:
如果有DataReadPD(byte ArrayOfData[], int NumberOfBytes)这个函数的源码的话就好跟踪了,如果有的话就贴出来让大家看看啊
BadPattern 2013-05-27
  • 打赏
  • 举报
回复
如果有DataReadPD(byte ArrayOfData[], int NumberOfBytes)这个函数的源码的话就好跟踪了,如果有的话就贴出来让大家看看啊
guigui002000 2013-05-27
  • 打赏
  • 举报
回复
关于用ByteBuffer的问题,是我在用byte[]崩溃后,有朋友让我试着用它,可是依然崩溃。 关于字节大小的问题,arrayOfData是用来存数据的数组吧,numberOfBytes是每次传进来的字节数,我觉得这两个大小不会导致崩溃吧。而且我也调节了下,还是crash 的。这个程序本来是一个师兄用MFC写的,老师让改成B/S模型,我的数据大小是按之前师兄的设置来的
引用 4 楼 dr8737010 的回复:
有问题的代码段: # Problematic frame: # C [sm125_Comm_Dll.dll+0x1c4b] native本地代码出现了问题,sm125_Comm_Dll.dll出了错误 猜测应该是public int DataReadPD(ByteBuffer ArrayOfData , int NumberOfBytes); 传递的参数导致底层计算的时候对内存产生了非法的读写 不知道为什么你把参数byte[]改成了ByteBuffer类型,而且分配了10000个字节,传递进去的numberOfBytes却只有100,你先看一下这块

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧