在上一篇文章中我谈了jni的基础知识,现在有人向我提出如何在dll中调用dll这个问题。刚开始我也一筹莫展,不知道如何去解决这个问题,找了一些资料,还是那篇文章“VC DLL简单教程”给了我启发。我可以先用vc++写一个dll,然后使用JNI的方法来调用这个dll,就实现了dll调用dll的目的了。我把我的实现过程写下来:
(1).在vc++中新建一个Win32 Dynamic-Link Library工程,名称为A,写一个c++源文件:code.cpp,其内容 为:
#include"iostream.h"
extern "C"
int _declspec(dllexport) add(int a ,int b)
{
return a+b;
}
然后编译-->Build,在A工程的debug文件夹里得到一个A.dll文件
(2).按照JNI 的方法,在java工程里面声明一个getNumber(int a,int b)的本地方法:
public class Pick {
/**
* @param args
*/
public native int getNumber(int a,int b);
public static void main(String[] args) {
}
}
然后在vc++中调用刚才的A.dll中的方法来实现该方法的功能,再建一个DLL工程B,添加三个头文件后,新建一个c++源文件mode.cpp 代码为:
#include<iostream.h>
#include<Windows.h>
#include"pp_Pick.h"
/*
* Class: pp_Pick
* Method: getNumber
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_pp_Pick_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);
}
编译,生成B.dll
(3).然后把A.dll和B.dll都放进java工程根目录下,调用B.dll,运用getNumber(int a,int b)方法。
public class Pick {
/**
* @param args
*/
public native int getNumber(int a,int b);
public static void main(String[] args) {
// TODO Auto-generated method stub
System.loadLibrary("B1");
Pick p=new Pick();
System.out.println(p.getNumber(1, 100));
}
}
运行,输出结果为:101
至此,dll调用dll的功能已经实现============。