JNA调用c#的DLL

隐身守侯 提交于 2020-02-26 12:53:44

1:C#中代码:因为我的JDK是64位,所以vs2013中release也要用x64编译

namespace cSharpDLLforJNA
{
    public class Main
    {
        public struct user
        {
            public int id;
            public string name;
            public int age;
        }
        public void sayuser(user user)
        {
            Console.WriteLine(user.name + ":id=" + user.id + " age=" + user.age);
        }
    }
}

2:JnaDemo.java中

public class User extends Structure
    {
        public class ByReference extends User implements Structure.ByReference{}
        public class ByValue extends User implements Structure.ByValue{}
        public int id;
        public String name;
        public int age;
    }
    public  interface CSharpDLLforJNA extends Library{
        //总是出现找不到dll库文件异常,参考https://www.cnblogs.com/developer_chan/p/7537849.html
        //利用URL,并且将dll放在jnadll包下,pom.xml中还要打包dll文件则不会出现找不到DLL的异常了
        //<resources>
        //    <resource>
        //        <directory>src/main/java</directory>
       //         <includes>
       //           <include>**/*.xml</include>
       //           <include>**/*.properties</include>
       //           <include>**/*.fxml</include>
       //           <include>**/*.png</include>
       //           <include>**/*.dll</include>
       //       </includes>
       //       <filtering>true</filtering>
       //   </resource>
       //</resources>

        URL dllurl =  CSharpDLLforJNA.class.getResource("jnadll/cSharpDLLforJNA.dll");
        String libpathstring= dllurl.getFile().substring(1).replace("/","//");
        CSharpDLLforJNA C_SHARP_DL_LFOR_JNA = Native.load(libpathstring,CSharpDLLforJNA.class);
        public void sayuser(User user);//在接口interface CSharpDLLforJNA中申明的public型void sayusere,
        // 感觉如果是在平常的java代码中,sayuser前面的public是可以不要的,此处应该也可以不要吧?等实验成功之后再删除试一试

    }
    public void javasayuser(User userStruct)
    {

        System.out.println("javasayuser:");
        CSharpDLLforJNA.C_SHARP_DL_LFOR_JNA.sayuser(userStruct);//new UserStruct可不可以用注解???
    }

3:调用代码:

JnaDemo jnaDemo = new JnaDemo();
        JnaDemo.User user=  jnaDemo.new User();
        user.id=10;
        user.age=20;
        user.name="zhanshan";
        jnaDemo.javasayuser(user);

4:异常如下:

Caused by: java.lang.UnsatisfiedLinkError: Error looking up function 'sayuser': 找不到指定的程序。

    at com.sun.jna.Function.<init>(Function.java:252)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:594)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:570)
    at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:556)
    at com.sun.jna.Library$Handler.invoke(Library.java:243)
    at com.sun.proxy.$Proxy41.sayuser(Unknown Source)
    at com.joe.javafx_springboot_pom.JnaDemo.javasayuser(JnaDemo.java:121)
    at com.joe.javafx_springboot_pom.controller.HelloController.btnclickOnAction(HelloController.java:105)

5:以上异常说明c#生成的dll库中没有sayuser,我用dumpbin /exports  CSharoDLLforJNA.dll,显示如下:

Microsoft (R) COFF/PE Dumper Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file cSharpDLLforJNA.dll

File Type: DLL

  Summary

        2000 .rsrc
        2000 .text

这也说明,我的c#生成的dll库中没有输出sayuser函数。其实这是因为c# .net生成的dll是托管类库,虽然形式上是DLL,但它不是一般普通意义上的DLL,所以dumpbin是看不到导出的函数的。所以,要想在jna中用C#的dll则要中转一次,具体做法参考  https://blog.csdn.net/qq_24038299/article/details/68059480  及  https://blog.csdn.net/l527719041/article/details/78670532

https://blog.csdn.net/truelove12358/article/details/84468692 (见其中的 3.Java调用C# dll 步骤 )

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!