开发者社区> 问答> 正文

JNA调用DLL除了JDK的bin目录其它路径都报错 403.10 禁止访问:配置无效 

我用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文件是没有的这个区别。

展开
收起
kun坤 2020-05-27 10:01:11 738 0
1 条回答
写回答
取消 提交回答
  • ######

    引用来自“二的基本算合格”的答案

    JNA的路径是基于java.library.path或者系统变量LD_LIBRARY寻找dll或是so库文件,调用之前,你可以看一下文件是否在变量值的路径内。
    println(f"#${System.getProperty("java.library.path")}#")
    正常只要dll或者so文件在目录下就可以正确运行。 另外,注意linux下的so文件命名有一个前缀lib而dll文件是没有的这个区别。
    下面都是输出的java.library.path路径: D:\Program Files\Java\jdk1.6.0_45\bin;//放在这个目录下可以正常运行 C:\Windows\Sun\Java\bin; C:\Windows\system32;//放在这里出现无效内存访问 C:\Windows; D:/Program Files/MyEclipse Professional/binary/com.sun.java.jdk.win32.x86_1.6.0.u43/jre/bin/client; D:/Program Files/MyEclipse Professional/binary/com.sun.java.jdk.win32.x86_1.6.0.u43/jre/bin;//放在这里也可以 D:/Program Files/MyEclipse Professional/binary/com.sun.java.jdk.win32.x86_1.6.0.u43/jre/lib/i386; C:\Windows\system32; C:\Windows; C:\Windows\System32\Wbem; C:\Windows\System32\WindowsPowerShell\v1.0\; C:\Program Files\Intel\Services\IPT\; C:\Program Files\Intel\OpenCL SDK\2.0\bin\x86; C:\Users\Think\Desktop\yncaDllJna;//我现在存放的路径,还是出现下面的异常 D:\Program Files\Java\jdk1.6.0_45\bin;;. 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:24)  
    ######JNA出问题的可能性比较小,你的dll库,有没有认真测试过。######

    引用来自“sw_ust”的答案

    引用来自“二的基本算合格”的答案

    JNA的路径是基于java.library.path或者系统变量LD_LIBRARY寻找dll或是so库文件,调用之前,你可以看一下文件是否在变量值的路径内。
    println(f"#${System.getProperty("java.library.path")}#")
    正常只要dll或者so文件在目录下就可以正确运行。 另外,注意linux下的so文件命名有一个前缀lib而dll文件是没有的这个区别。
    下面都是输出的java.library.path路径: D:\Program Files\Java\jdk1.6.0_45\bin;//放在这个目录下可以正常运行 C:\Windows\Sun\Java\bin; C:\Windows\system32;//放在这里出现无效内存访问 C:\Windows; D:/Program Files/MyEclipse Professional/binary/com.sun.java.jdk.win32.x86_1.6.0.u43/jre/bin/client; D:/Program Files/MyEclipse Professional/binary/com.sun.java.jdk.win32.x86_1.6.0.u43/jre/bin;//放在这里也可以 D:/Program Files/MyEclipse Professional/binary/com.sun.java.jdk.win32.x86_1.6.0.u43/jre/lib/i386; C:\Windows\system32; C:\Windows; C:\Windows\System32\Wbem; C:\Windows\System32\WindowsPowerShell\v1.0\; C:\Program Files\Intel\Services\IPT\; C:\Program Files\Intel\OpenCL SDK\2.0\bin\x86; C:\Users\Think\Desktop\yncaDllJna;//我现在存放的路径,还是出现下面的异常 D:\Program Files\Java\jdk1.6.0_45\bin;;. 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:24)  
    java.lang.Error: Invalid memory access这个错误不是你路径的问题,具体应该看你的代码了。 猜测是不是你在适用引用对象的时候有点问题,例如找找有没有下面之类的代码:
    PointerByReference.getValue()
    一般这种错误都是由指针的操作导致的。方便的话,最好把关键代码贴上来。
    ######真头痛######

    引用来自“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. #  
    请问这个问题解决了吗,我也遇到了一样的问题,求方法!!!######求解
    2020-05-27 13:37:50
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载