本文涉及到的环境是:win7 64位/MyEclipse 6.5/JDK1.6/VS2010(可选,用来新建DLL,因为一般都已经有DLL用来调用了,这里只是为了演示)
需要的资源:jna.jar
javaCallCpp.cpp代码清单extern "C" _declspec(dllexport) void hello(); extern "C" _declspec(dllexport) int add(int first, int second);
#include "javaCallCpp.h" #include <iostream> int add(int a, int b){ return a+b; } void hello() { printf("Hello World!\n"); }
Test.java代码清单package com.aaron.demo; import com.sun.jna.Library; import com.sun.jna.Native; public interface JavaCallCppService extends Library { //javaCallCpp.dll 放到工程目录下才行(与.classpath一级),原文注释写到也可以放到C:\WINDOWS\system32下,但我放到system32下运行项目,依然会报错 JavaCallCppService INSTANCE = (JavaCallCppService)Native.loadLibrary("demo", JavaCallCppService.class); public int add(int a, int b); public void hello(); }
package com.aaron.demo; public class JavaCallCppTest { public static void main(String[] args) { System.out.println(JavaCallCppService.INSTANCE.add(1,2)); JavaCallCppService.INSTANCE.hello(); } }
整个过程其实比较简单,但我在完成这个过程的过程中,程序总是报错,类似如下
换了几个不同博文的demo,直到最后在http://ynp.iteye.com/blog/2183118博客中,在下载的demo里面发现他采用的jre是1.6的,而我Myeclipse默认采用的jre7,终于恍然大悟。还没在网上遇到说报这个错误是因为jre引起的,这种坑爹的错,不多看几个例子真是难以发现!这也是我觉得先采用一个简单的dll文件来保证调用过程没问题,再开始调用实际用的dll的原因,因为我们得首先保证调用过程没问题,才可以开始怀疑是不是dll本身的问题。Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'demo': ???????¨ at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:145) at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:188) at com.sun.jna.Library$Handler.<init>(Library.java:123) at com.sun.jna.Native.loadLibrary(Native.java:255) at com.sun.jna.Native.loadLibrary(Native.java:241) at com.aaron.demo.JavaCallCppService.<clinit>(JavaCallCppService.java:7) at com.aaron.demo.JavaCallCppTest.main(JavaCallCppTest.java:5)