求助 Tomcat 通过web调用jnative申请内存出错 MemoryBlockFactory.createMemoryBlock

bingwen520 2014-02-12 12:09:44
文件1:CardMnagerfromdll.java

package com.sql.CardManager;

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

public class CardManagerfromdll
{
static JNative Something = null;
static Pointer pointer;
static Pointer cardidPointer;

public String getCardid(Pointer pTar) throws NativeException,
IllegalAccessException
{

try
{
if (Something == null)
{
Something = new JNative(
"D:/eclipse/workspace/dllinterface/bin/dllcall/ZWTCardManager.dll",
"ReadCard");
// 利用org.xvolks.jnative.JNative 来装载
// 路径+testdll.dll,并利用其fnTestdll函数

Something.setRetVal(Type.INT);
// 指定返回参数的类型
}

// 传入参数设置
int i = 0;
Something.setParameter(i++, pTar);
System.out.println("调用的DLL文件名为:" + Something.getDLLName());
System.out.println("调用的方法名为:" + Something.getFunctionName());
System.out.println("第一个传入参数为:" + pTar.getAsString());

// 将设置好的参数载入
Something.invoke();

// 开始调用dll函数
return Something.getRetVal();
} finally
{
if (Something != null)
{
Something.dispose();// 释放
}
}
}

public String UpdateCardid(Pointer pTar,Pointer cardid) throws NativeException,
IllegalAccessException
{

try
{
if (Something == null)
{
Something = new JNative(
"D:/eclipse/workspace/dllinterface/bin/dllcall/ZWTCardManager.dll",
"WriteCard");
// 利用org.xvolks.jnative.JNative 来装载
// 路径+testdll.dll,并利用其fnTestdll函数

Something.setRetVal(Type.INT);
// 指定返回参数的类型
}

// 传入参数设置
int i = 0;
Something.setParameter(i++, pTar);
Something.setParameter(i++, cardid);
System.out.println("调用的DLL文件名为:" + Something.getDLLName());
System.out.println("调用的方法名为:" + Something.getFunctionName());
System.out.println("第一个传入参数为:" + pTar.getAsString());
System.out.println("第二个传入参数为:" + cardid.getAsString());
// 将设置好的参数载入
Something.invoke();

// 开始调用dll函数
return Something.getRetVal();
} finally
{
if (Something != null)
{
Something.dispose();// 释放
}
}
}

public static void main(String[] args) throws NativeException,
IllegalAccessException
{
CardManagerfromdll manager = new CardManagerfromdll();
cardidPointer = new Pointer(MemoryBlockFactory.createMemoryBlock(16));
cardidPointer.setMemory("8888095110000004");
// 指针参数定义
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(200));
pointer.setStringAt(0, "0");
// String result1 = manager.UpdateCardid(pointer, cardidPointer);
String result = manager.getCardid(pointer);
System.err.println("返回参数:" + result);
System.err.println("卡号为:" + pointer.getAsString());
}
}

文件2:CardDll.java
package com.sql.CardManager;

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

public class CardDll
{
static Pointer pointer;
static Pointer cardidPointer;

public String readCard()
{
String cardid = "";
try
{
CardManagerfromdll manager = new CardManagerfromdll();
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(16));
pointer.setIntAt(0, 16);
manager.getCardid(pointer);
cardid = pointer.getAsString();
}catch(NativeException e) {
System.out.println("读卡信息出错:"
+ e.getMessage());
}catch(IllegalAccessException e1){
System.out.println("读卡信息出错:"
+ e1.getMessage());
}
return cardid;
}

public String writeCard(String cardid)
{
if(cardid.length() != 16)
{
System.out.println(cardid);
System.out.println("卡号只能是16位!");
return "卡号位数错误";
}
String status = "";
try
{
CardManagerfromdll manager = new CardManagerfromdll();
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(200));
cardidPointer = new Pointer(MemoryBlockFactory.createMemoryBlock(16));
pointer.setStringAt(0, "0");
cardidPointer.setMemory(cardid);
manager.UpdateCardid(pointer, cardidPointer);
status = pointer.getAsString();
}catch(NativeException e) {
System.out.println("写卡信息出错:"
+ e.getMessage());
}catch(IllegalAccessException e1){
System.out.println("写卡信息出错:"
+ e1.getMessage());
}
return status;
}

public static void main(String[] args) throws NativeException, IllegalAccessException
{
CardDll card = new CardDll();
// System.err.println("状态为: " + card.writeCard("8888095110000004"));
System.err.println("卡号为: "+card.readCard());
}
}

自己用main函数测试没问题,但是部署到tomcat下,调用到此代码会出现申请内存错误。
java.lang.NullPointerException
at org.xvolks.jnative.pointers.Pointer.dispose(Pointer.java:50)
at org.xvolks.jnative.pointers.Pointer.finalize(Pointer.java:395)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.xvolks.jnative.pointers.memory.MemoryBlockFactory.createMemoryBlock(MemoryBlockFactory.java:46)
at com.sql.CardManager.CardDll.<init>(CardDll.java:19)
at com.action.CardCtlJsonAction.ReadXinFaCard(CardCtlJsonAction.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
Caused by: java.lang.UnsatisfiedLinkError: org.xvolks.jnative.JNative.nMalloc(I)I
at org.xvolks.jnative.JNative.nMalloc(Native Method)
at org.xvolks.jnative.JNative.allocMemory(JNative.java:722)
at org.xvolks.jnative.pointers.memory.HeapMemoryBlock.reserveMemory(HeapMemoryBlock.java:34)
at org.xvolks.jnative.pointers.memory.HeapMemoryBlock.<init>(HeapMemoryBlock.java:21)
... 72 more
读卡信息出错:java.lang.reflect.InvocationTargetException
...全文
784 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
83年的小巷 2016-08-30
  • 打赏
  • 举报
回复
引用 6 楼 tcdyl1226 的回复:
请问楼主的操作系统和jdk分别是多少位的,我现在也遇到了这个问题,似乎JNative在64位操作系统环境下是不兼容的,有这回事吗?想知道楼主具体是怎么解决的。
jdk,用java -version命令看位数,操作系统看位数,不用说了吧? JNative跟操作系统位数无关,真正挑32/64位的,是你要调用的dll。调用32位的dll,你把程序指定32位的jre就行了。
tcdyl1226 2014-05-28
  • 打赏
  • 举报
回复
请问楼主的操作系统和jdk分别是多少位的,我现在也遇到了这个问题,似乎JNative在64位操作系统环境下是不兼容的,有这回事吗?想知道楼主具体是怎么解决的。
JavaUpgrade 2014-05-16
  • 打赏
  • 举报
回复
你的Jnative能在Tomcat中用?我的可以正常调用dll,但是Tomcat启动超时,每次都是这样的,你是怎么调用的啊?
姜小白- 2014-02-12
  • 打赏
  • 举报
回复
tomcat是在eclipse集成的吗?通过断点跟一下,上面还有个空指针异常,看具体的问题代码在哪一步
bingwen520 2014-02-12
  • 打赏
  • 举报
回复
我又调试了一下,以前是放在Myeclipse下出这个错误。 然后我又把工程部署到eclipse下,这个问题解决了。 网上有一个人说是jar包冲突,我所以用eclipse配置了一个纯净点的工程测试通过了。 谢谢各位。
姜小白- 2014-02-12
  • 打赏
  • 举报
回复
还没做过java调用dll动态库。在csdn上搜了下 MemoryBlockFactory 感觉“JNativeCpp.dll Windows下用的,拷到windows / system32目录下;此处的动态库需要区分64位和32位,需要和jdk版本一致,但是官方没有提供64位。我在win7 64位jdk下调用失败” 这一句话可能对楼主有用。希望楼主尽快找到解决方法
bingwen520 2014-02-12
  • 打赏
  • 举报
回复
空指针调试好了,还是申请内存那条语句的错误。 pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(200)); 到这里就错了。 但是我用单元测试,这句是没问题的,就是通过web上jsp页面调到java时就出现这个问题。 java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.xvolks.jnative.pointers.memory.MemoryBlockFactory.createMemoryBlock(MemoryBlockFactory.java:46) at com.sql.CardManager.CardDll.readCard(CardDll.java:18) at com.action.CardCtlJsonAction.ReadXinFaCard(CardCtlJsonAction.java:55) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441) at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.UnsatisfiedLinkError: org.xvolks.jnative.JNative.nMalloc(I)I at org.xvolks.jnative.JNative.nMalloc(Native Method) at org.xvolks.jnative.JNative.allocMemory(JNative.java:722) at org.xvolks.jnative.pointers.memory.HeapMemoryBlock.reserveMemory(HeapMemoryBlock.java:34) at org.xvolks.jnative.pointers.memory.HeapMemoryBlock.<init>(HeapMemoryBlock.java:21) ... 72 more 读卡信息出错:java.lang.reflect.InvocationTargetException

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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