开发者社区> 问答> 正文

JNA调用DLL除了JDK的bin目录其它路径都报错 - 服务报错

我用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)

 

展开
收起
montos 2020-05-30 11:18:58 1730 0
1 条回答
写回答
取消 提交回答
  • 写据对路径试试。我这边调用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文件是没有的这个区别。







    ######

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

    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-30 11:19:14
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

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