求助 Tomcat 通过web调用jnative申请内存出错 MemoryBlockFactory.createMemoryBlock
文件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