[转]Java调用dll文件的方法

JNI这个东西比较复杂 因为前几天自己刚好做过这个么东西 所以才推荐你用JNative的哦(我也是刚接触这个是个菜鸟).....
看楼主这么执着那我就写个小例子 大家不要见笑(- -!)
假设现在有个A.dll里面有个方法叫做int add(int a, int b)现在就是要用jni去调用它
这里附上A.dll里面的代码(自己瞎个的吧 能用就行)

C/C++ code
#include "stdafx.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } extern"C"int _declspec(dllexport) add(int a ,int b) { return a+b; }



接下来我们的思路自己写个B.dll然后在这个dll里面去调用A.dll里面的这个add方法,然后通过JAVA去调用自己的这个B.DLL....
第一步: 随便建个txt文件 呵呵 当然后缀改上.JAVA写上

Java code
publicclass DemoJni{ publicnativeint getNumber(int a,int b); publicstaticvoid main(String[] args) { } }



然后javac一下 没错的话 javah 生成了DemoJni.h(如下)

C/C++ code
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h>/* Header for class DemoJni */ #ifndef _Included_DemoJni #define _Included_DemoJni #ifdef __cplusplus extern"C" { #endif/* * Class: DemoJni * Method: getNumber * Signature: (II)I */ JNIEXPORT jint JNICALL Java_DemoJni_getNumber (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif#endif



用VC++6.0写B.DLL
新建DLL工程名字为B 在Header FILES->添加这个DemoJni.h
然后就写B.cpp

C/C++ code
// B.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "jni.h" #include "DemoJni.h" BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } JNIEXPORT jint JNICALL Java_DemoJni_getNumber (JNIEnv * env, jobject o, jint x, jint y) { typedef int (*ADD)(int ,int);//函数指针类型 HINSTANCE Hint = ::LoadLibrary("A.dll");//加载我们刚才生成的dll ADD add = (ADD)GetProcAddress(Hint,"add");//取得dll导出的add方法return add(x,y); FreeLibrary(Hint); }


对了在VC++6.0要引入java的一些包 因为我们上面引入了#include "jni.h"
具体做法 工具->选项->目录->新建两个路径 :比如C:\PROGRAM FILES\JAVA\JDK1.5.0_14\INCLUDE
和C:\PROGRAM FILES\JAVA\JDK1.5.0_14\INCLUDE\WIN32
搞定后就可以编译了 然后在debug文件下面就生成了我们要的B.DLL
 然后A.DLL和B.DLL以及.java文件放一起咯
下面就是调用 改写我们的.java文件如下

Java code
publicclass DemoJni{ publicnativeint getNumber(int a,int b); publicstaticvoid main(String[] args) { System.loadLibrary("B"); DemoJni p=new DemoJni(); System.out.println(p.getNumber(1, 100)); } }



然后java 一下 然后输出
101
然后OK!

这个东西如果用JNative来做的话 实在是太简单了- -!附上JNative的代码

Java code
import org.xvolks.jnative.JNative; import org.xvolks.jnative.Type; import org.xvolks.jnative.exceptions.NativeException; publicclass test { static JNative myjnative =null; publicint getnumber(int a, int b) throws NativeException, IllegalAccessException { try { if (myjnative ==null) { myjnative =new JNative("A.dll", "add"); myjnative.setRetVal(Type.INT); } int i =0; myjnative.setParameter(i++, a); myjnative.setParameter(i++, b); myjnative.invoke(); return myjnative.getRetValAsInt(); } finally { if (myjnative !=null) { myjnative.dispose(); } } } publicstaticvoid main(String[] args) throws NativeException, IllegalAccessException { test uc =new test(); int result = uc.getnumber(1,100); System.err.println("result:"+ result); } }



Jnative我觉得有个很好的地方就是有POINTER 指针这个东西.....

posted @ 2011-10-29 15:08  潁川君  阅读(3814)  评论(0编辑  收藏  举报