JNA、JNative、JInvoke、VC创建DLL、调用测试下载
1-1、VC++6.0创建DLL
新建工程,选择Win32 Dynamic-Link Library,工程名称CreateDLL。点击确定。
一个简单的DLL工程,完成。
新建头文件testdll.h,确定。
#ifndef TestDll_H_
#define TestDll_H_
#ifdef MYLIBDLL
#define MYLIBDLL extern "C" _declspec(dllimport)
#else
#define MYLIBDLL extern "C" _declspec(dllexport)
#endif
MYLIBDLL int Add(int plus1, int plus2);
//You can also write like this:
//extern "C" {
//_declspec(dllexport) int Add(int plus1, int plus2);
//};
#endif
新建testdll.cpp,确定。
#include "stdafx.h"
#include "testdll.h"
#include
using namespace std;
int Add(int arg0, int arg1)
{
int result = arg0 + arg1;
return result;
}
编译组建之后,CreateDLL\Debug下即生成CreateDLL.dll。
1-2、VS创建DLL
新建Win32项目或Win32控制台程序,名称CreateDLL,确定。
下一步。
选择DLL,完成。
生成如下。
右键-添加-新建项:头文件CreateDLL.h
CreateDLL.h
extern "C" _declspec(dllexport)//导出
int Add(int x, int y);
CreateDLL.cpp
extern "C" _declspec(dllexport)
int Add(int x, int y)
{
return x+y;
}
编译-生成,在Create\Debuge下生成CreateDLL.dll
2-1、JAVA-JNA调用DLL
将dll复制到项目根目录。
引入jna.jar
TestJNA.java
import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;
public class TestJNA {
public interface jnatest extends StdCallLibrary {
jnatest INSTANCE = (jnatest) Native.loadLibrary("msvcrt", jnatest.class);
void printf(String format, Object... args);
}
public interface CreateDLLTest extends StdCallLibrary {
CreateDLLTest INSTANCE = (CreateDLLTest) Native.loadLibrary("CreateDLL", CreateDLLTest.class);
int Add(int plus1, int plus2);
}
public static void main(String[] args) {
jnatest.INSTANCE.printf("Hello, World\n");
int result = CreateDLLTest.INSTANCE.Add(1,2);
System.out.println("结果为" + result);
}
}
2-2、JAVA-JNative调用DLL
将dll复制到项目根目录。
引入JNative.jar
TestJNative.java
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.util.Kernel32.SystemTime;
public class TestJNative {
/**
* 获取系统时间
* @return
* @throws NativeException
* @throws IllegalAccessException
*/
public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
// Kernel32.dll为dll名称,Kernel32目录的位置为:C:\Windows\System32下面,
// GetSystemTime为Kernel32.dll中的一个方法.
JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");
SystemTime systemTime = new SystemTime();
// 设置参数
nGetSystemTime.setParameter(0, systemTime.getPointer());
nGetSystemTime.invoke();
// 解析结构指针内容
return systemTime.getValueFromPointer();
}
/**
* 编写调用dll例子 加法测试
* @return
* @throws NativeException
* @throws IllegalAccessException
*/
public static int Add(int a, int b) throws NativeException, IllegalAccessException {
JNative jnative = new JNative("CreateDLL.dll", "Add");
jnative.setRetVal(Type.INT);
jnative.setParameter(0, Type.INT, ""+a);
jnative.setParameter(1, Type.INT, ""+b);
jnative.invoke();
return jnative.getRetValAsInt();
}
public static void main(String[] args) throws IllegalAccessException, NativeException {
System.out.println(GetSystemTime());
System.out.println(Add(3, 4));
}
}
2-3、JAVA-JInvoke调用DLL
将dll复制到项目根目录。
引入jinvoke.jar
TestJInvoke.java
import com.jinvoke.JInvoke;
import com.jinvoke.NativeImport;
public class TestJInvoke {
@NativeImport(library="User32")
public static native int MessageBox(int hwnd,
String text, String caption, int type); //windows Api MessageBox函数原型
@NativeImport(library="CreateDLL")
public static native int Add(int a, int b);
public static void main(String[] args) {
JInvoke.initialize();
MessageBox(0,"JInvoke测试成功", "消息框",0);
System.out.println(Add(5, 6));
}
}
3-1、VC++调用DLL
新建工程,选择Win32 Console Application,工程名CallDLL,确定。
一个简单的程序,完成。
CallDLL.cpp
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
int a,b;
typedef int(*pTest)(int a,int b);//函数指针
pTest Test=NULL;
HINSTANCE hDLL;
hDLL=LoadLibrary("CreateDLL.dll");//加载动态链接库CreateDLL.dll文件,或全路径E:\\VC\\CallDLL\\Debug\\CreateDLL.dll
if (hDLL!=NULL)
{
cout<<"加载dll成功"<>a;
cout<<"请输入一个整数b=";
cin>>b;
int C=Test(a,b);
cout<
3-2、VS调用 DLL
新建win32控制台应用程序,CallDLL
(1)隐式链接
隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。
CreateDLL.dll和CreateDLL.lib拷贝到当前工程所在的目录下面(\CallDLL\CallDLL)
HideCallDLL.h
#pragma comment(lib,"CreateDll.lib")
extern "C"_declspec(dllimport) int Add(int x,int y);
HideCallDLL.cpp
#include "stdafx.h"
#include "HideCallDLL.h"
void main()
{
int result = 0;
result = Add(1, 2);
printf("和为%d\n",result);
getchar();
}
调试-开始调试(不执行)Ctrl+F5
(2)显式链接
显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件。
CreateDLL.dll复制到当前工程所在的目录下面(\CallDLL\CallDLL)
(main方法在哪个里面就执行哪个cpp)
CallDLL.cpp
#include "stdafx.h"
#include
#include
#include
using namespace std;
int main()
{
int a,b;
typedef int(*lpAddFun)(int a,int b);//函数指针,或typedef int(*lpAddFun)(int ,int );
lpAddFun addfun=NULL;
HINSTANCE hDLL;
hDLL=LoadLibrary(L"CreateDLL.dll");//加载动态链接库CreateDLL.dll文件,或全路径E:\\VS\\CallDLL\\CallDLL\\CreateDLL.dll
if (hDLL!=NULL)
{
printf("加载dll成功\n");
addfun=(lpAddFun)GetProcAddress(hDLL,"Add");
if (addfun)//如果取出函数成功,则执行下面的语句
{
printf("取出函数成功\n");
cout<<"请输入一个整数a=";
cin>>a;
cout<<"请输入一个整数b=";
cin>>b;
int result = 0;
result = addfun(a, b);
printf("和为%d\n",result);
printf("OK\n");
}
else
{
printf("取出函数失败\n");
}
}
else
{
printf("加载dll失败\n");
}
FreeLibrary(hDLL);//卸载动态链接库;
getchar();
getchar();
return 0;
}