JAVA通过JNI调用本地方法,而本地方法是以动态链接库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式).通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法,将JAVA应用与C++结合起来相互弥补自身的不足.这里举出了JAVA两种方法引入C++动态库的方式:(示例中以TxdnetDll.dll为例)static { System.loadLibrary(“TxdnetDll”); //放在java库路径中 ,一般是windows系统目录或system32目录} static { System.load(“C:\web\lib\TxdnetDll.dll”); //这种方式比较灵活,不限制于目录}下面就举例来简单说明如何使用C++写的动态链接库开发环境C++开发环境:DEV-C++ 5JAVA开发环境:Editplus2通过Dll.java类引入动态链接库Dll.javapackage Jni.Test;public class Dll {private static String dllPath;public Dll(){}public static void loadlib(String dllpath){dllPath = dllpath ;//static //{//System.loadLibrary(dllPath + "TxdnetDll.dll");//载入dllSystem.load(dllPath + "TxdnetDll.dll");//载入dll//}}public native static int outInt(int i);//函数声明}在Jni同目录执行命令:javac -source 1.5 -target 1.5 Jni/Test/Dll.javajavah -jni Jni.Test.Dll会在jni同目录下生成一个头文件:Jni_Test_Dll.h/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class Jni_Test_Dll */#ifndef _Included_Jni_Test_Dll#define _Included_Jni_Test_Dll#ifdef __cplusplusextern "C" {#endif/** Class: Jni_Test_Dll* Method: outInt* Signature: (I)I*/JNIEXPORT jint JNICALL Java_Jni_Test_Dll_outInt(JNIEnv *, jclass, jint);#ifdef __cplusplus}#endif#endif定义了jni方式的函数接口现在我们建立C++ 动态链接库Txdnetdll.dll用dev-c++新建工程,类型为c++动态链接库将jdk目录下的include目录中的jni.h,jni_md.h文件添加到工程项目中,并修改Jni_Test_Dll.h中<jni.h>为"jni.h";注意"与<>的区别是不同的,一个是当前目录中寻找,一个是开发环境的include文件下寻找头文件.所以这里将<jni.h>改为"jni.h"完整的dllmain.cpp内容为:/* Replace "dll.h" with the name of your header */#include "dll.h"#include <windows.h>#include "Jni_Test_Dll.h"#include "jni.h"#include "jni_md.h"DllClass::DllClass(){}DllClass::~DllClass (){}BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,DWORD reason /* Reason this function is being called. */ ,LPVOID reserved /* Not used. */ ){switch (reason){case DLL_PROCESS_ATTACH:break;case DLL_PROCESS_DETACH:break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;}/* Returns TRUE on success, FALSE on failure */return TRUE;}JNIEXPORT jint JNICALL Java_Jni_Test_Dll_outInt(JNIEnv *, jclass, jint p){int j = p*3;return j; }编译后会生成一个TxdnetDll.dll动态链接库文件现在我们在JSP中调用:将TxdnetDll.dll放到WEB-INF下,测试JSP文件调用代码为:...Jni.Test.Dll d = new Jni.Test.Dll();d.loadlib(pageContext.getServletContext().getRealPath("/")+"/WEB-INF/");out.print(d.outInt(15) );...注意如果在运行过程中出现:java.lang.UnsatisfiedLinkError错误可能的情况是动态链接库位置错误,没有发现动态链接库.如果重新编译后替换掉DLL,则需要关闭JSP服务器,JSP服务器调用动态链接库是常驻内存的这里是一个稍微复杂点功能的动态链接库调用,功能是将客户端提交的字符在C++库中与另外字符连接然后输出,需要代码的朋友可以给我留言在线测试 ------- http://www.txdnet.cn/ShowEssay-2-1983-Txdnet.jsp

评论