第一次用到这个。网上也查了很多资料 总结下
JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。
参考链接:https://www.jianshu.com/p/68c64845f87f
下载:下载jni4net
下载后、解压到相应目录,主要是bin和lib目录下的内容,我的如下图:
利用vs2013 写一个 MyCSharpDemoCalc.dll
创建一个java项目 MyCalcUsageInJava.java
切换到jni4net的bin目录下,并执行命令: .\proxygen.exe "DLL所在路径" -wd "java项目根路径",执行后返回java项目的根目录下会多出下图红色框中的文件
java 项目 目录会多一切文件 clr 与 jvm 如图
将命令行切换到java项目的根目录下,执行命令build.cmd,java项目根目录下会编译出2个文件分别为MyCSharpDemoCalc.j4n.dll和MyCSharpDemoCalc.j4n.jar,如下图
然后将 jni4net的 lib 目录下的jar文件和dll文件copy到java项目的根目录下,将C#项目的 MyCSharpDemoCalc.dll的文件也copy到java项目的根目录下,并将MyCSharpDemoCalc.j4n.jar 和 jni4net.j-0.8.8.0.jar添加到Build Path(必须把jni4net-0.8.8.0-bin 中的lib文件下的全拷贝到java项目根目录中 与 MyCSharpDemoCalc.dll 同级),如下图
eclipse - Exception in thread "main" java.lang.UnsatisfiedLinkError:******(Lnet/sf/jni4net/inj/IClrProxy;)V
原因 :
jar包引用错了、我把 jni4net.j-0.8.8.0.jar 复制放入根目录下。在java项目里引用的时候用的是 解压文件里的同名jar包 报此错
Exception in thread "main" System.Reflection.ReflectionTypeLoadException: 无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。
原因 :
加载的dll文件不全 或者 损坏 复制lib 中的文件 与 重新生成 MyCSharpDemoCalc.dll 文件
成功运行: