我用JNA调用C实现PDF电子签章,我把所有的DLL文件放到JDK的bin目录下可以正常运行,但改成绝对路径,就报无效内在访问,把该路径设到系统环境变量也是报错,放在system32下也是一样的错误: Exception in thread "main" java.lang.Error: Invalid memory access
at com.sun.jna.Native.invokeInt(Native Method)
at com.sun.jna.Function.invoke(Function.java:383)
at com.sun.jna.Function.invoke(Function.java:315)
at com.sun.jna.Library$Handler.invoke(Library.java:212)
at com.sun.proxy.$Proxy0.SIGNPDF(Unknown Source)
at com.cqcca.pdf.SignPDF.main(SignPDF.java:22)
写据对路径试试。我这边调用dll的时候,有时候放.java的同级目录,然后直接写动态库名称就会报错,但是是说找不到dll。如果写绝对路径,例如E:\MyDll.dll就没问题。现在我是这样写的,也没问题######
引用来自“张贵成”的答案
写据对路径试试。我这边调用dll的时候,有时候放.java的同级目录,然后直接写动态库名称就会报错,但是是说找不到dll。如果写绝对路径,例如E:\\MyDll.dll就没问题。现在我是这样写的,也没问题
######刚刚手贱,直接提交了,忘记传图了
######
引用来自“张贵成”的答案
引用来自“张贵成”的答案
写据对路径试试。我这边调用dll的时候,有时候放.java的同级目录,然后直接写动态库名称就会报错,但是是说找不到dll。如果写绝对路径,例如E:\\MyDll.dll就没问题。现在我是这样写的,也没问题
非常感谢这哥们的回复,我写了绝对路径还是不行,非得在jdk的bin目录下才可以,没辙了,现在换成JNI来实现: public class WLPTJNINetSign { static{ System.loadLibrary("abc"); } public native int getCSPVersion();//调这个方法可以正常运行 public native int SignPDF(String srcPath, String desPath);//调这个方法就报下面的错 public static void main(String[] args) { try { WLPTJNINetSign wlptjniNetSign=new WLPTJNINetSign(); System.out.println(wlptjniNetSign.SignPDF(srcPath, desPath)); } catch (Exception e) { e.printStackTrace(); } } } 完了却又报这个错,是java的原因还是c++的原因呢 # # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (0xe0434f4d), pid=8584, tid=10028 # # JRE version: 6.0_45-b06 # Java VM: Java HotSpot(TM) Client VM (20.45-b01 mixed mode, sharing windows-x86 ) # Problematic frame: # C [KERNELBASE.dll+0x812f] # # An error report file with more information is saved as: # E:\Workspaces\hs_err_pid8584.log # # 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. #
######
引用来自“sw_ust”的答案
引用来自“张贵成”的答案
引用来自“张贵成”的答案
写据对路径试试。我这边调用dll的时候,有时候放.java的同级目录,然后直接写动态库名称就会报错,但是是说找不到dll。如果写绝对路径,例如E:\\MyDll.dll就没问题。现在我是这样写的,也没问题
非常感谢这哥们的回复,我写了绝对路径还是不行,非得在jdk的bin目录下才可以,没辙了,现在换成JNI来实现: public class WLPTJNINetSign { static{ System.loadLibrary("abc"); } public native int getCSPVersion();//调这个方法可以正常运行 public native int SignPDF(String srcPath, String desPath);//调这个方法就报下面的错 public static void main(String[] args) { try { WLPTJNINetSign wlptjniNetSign=new WLPTJNINetSign(); System.out.println(wlptjniNetSign.SignPDF(srcPath, desPath)); } catch (Exception e) { e.printStackTrace(); } } } 完了却又报这个错,是java的原因还是c++的原因呢 # # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (0xe0434f4d), pid=8584, tid=10028 # # JRE version: 6.0_45-b06 # Java VM: Java HotSpot(TM) Client VM (20.45-b01 mixed mode, sharing windows-x86 ) # Problematic frame: # C [KERNELBASE.dll+0x812f] # # An error report file with more information is saved as: # E:\Workspaces\hs_err_pid8584.log # # 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没问题!
###### JNA的路径是基于java.library.path或者系统变量LD_LIBRARY寻找dll或是so库文件,调用之前,你可以看一下文件是否在变量值的路径内。
println(f"#${System.getProperty("java.library.path")}#")
正常只要dll或者so文件在目录下就可以正确运行。 另外,注意linux下的so文件命名有一个前缀lib而dll文件是没有的这个区别。