日期:2014-05-20  浏览次数:20889 次

在java中怎么去调用C++编写的.dll函数?
公司的项目需要用到C++编写的发送短信的函数,然后我想在java这边进行调用,不知道如何调用?总是报出异常,Exception in thread "main" java.lang.IllegalStateException: JNative library not loaded, sorry !
at org.xvolks.jnative.JNative.<init>(JNative.java:337)
at org.xvolks.jnative.JNative.<init>(JNative.java:269)
at com.hd.test.SendSMS.send_sms(SendSMS.java:16)
at com.hd.test.SendSMS.main(SendSMS.java:52)
有的时候还报出:Exception in thread "main" java.lang.UnsatisfiedLinkError: no src/MFCDLL/hest_global_file.dll in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at SendMess.<clinit>(SendMess.java:5)
at TestSend.main(TestSend.java:6)
这个异常,不知道怎么回事?,刚接触java不久,C++还没接触过?还望大牛们指导。。谢谢!!
Java C++ 异常

------解决方案--------------------
你怎么调用的?jni?
------解决方案--------------------
1、导入dll到工程的相对路径。
2、生产dll的原生函数。就可以了。
 参考如下:
public class TestNative {
 private native static int Max(int a, int b);
 private native static String GetLicense(String a);

 public static void main(String[] args) {
 TestNative license = new TestNative();
 System.out.println("lll:" + license.getMaxNum());
 System.out.println("hd:" + license.GetLicense());
 }

 static {

 System.loadLibrary("A3");
 }

 public int getMaxNum(){
 return Max(4, 5);
 }

 public String GetLicense(){
 return GetLicense("");
 }
 } 
------解决方案--------------------
有两种方式吧,有JNI,有JNA,JNA的比较方便店,本来有提供的dll函数接口,你自己写个java接口,就可以匹配这个函数名了,他需要参数,你就传什么进去,JNI的方式比较麻烦,还需要自己写完java接口再生成.h文件,然后再写个.cpp文件来实现...不过jni的性能明显比jna的要好很多,具体的你可以到我的博客看下那个jna的简单例子,找着搬下去就可以了,只是返回类型或者参数类型是复杂的,你自己看看怎么操作这复杂类型