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 步骤 )
来源:oschina
链接:https://my.oschina.net/u/2963604/blog/3163112