参考
Java进阶: 使用 Jni 调用 Dll 的实现(使用VS2008 生成Dll)
http://www.cnblogs.com/charley_yang/archive/2011/03/15/1985494.html
前言
-----------------------本前言来自网络--------------------------
JNI技术的出现主要是基于三个方面的应用需求:
1. 解决性能问题
2. 解决本机平台接口调用问题
3. 嵌入式开发应用
-------------------------前言结束--------------------------------
下面动手来使用Jni调用本地方法来调用Cls,其他情况请见参考资料。具体内容如下:
第一步:编写Java端代码
定义一个Java类Cls
package TestDemo;
/**
* Created by DH on 2015-10-24.
*/
public class Cls {
// 声明本地方法
public native void clear();
static {
//加载DLL
System.loadLibrary("ClsCPP");
}
}
定义一个调用类ClsDemo
package TestDemo;
import java.util.Scanner;
public class ClsDemo {
public static void main(String args[]){
final Cls clearScreen = new Cls();
System.out.println("Hello,world");
Scanner sc = new Scanner(System.in);
String temp = sc.nextLine();
clearScreen.clear();
}
}
编译整个包。
cmd进入生成.class的文件夹TestDemo所在的目录,执行javah TestDemo.Cls
以上是含有包的情况,若只有一个class,没有包,则在存在.class目录执行javah Cls
第二步:生成DLL库
1. 打开VS2008,创建一个名称为ClsCPP的C++ Win32项目。在向导的应用程序类型处选择DLL,点完成。
设置Release编译配置。这个根据系统和编译器的设置,64位设置为x64位,32位的设置为x86
2. 将签名生成的TestDemo_Cls.h文件拷贝到ClsCpp项目的根目录下
3. 将jni.h和win32文件夹中的jni_md.h拷贝到项目的根目录中,它们在jdk目录中的include文件夹中。
4.然后在VS中右键头文件文件夹添加现有项把这个头文件包含进来,接下来就是编辑Cls.cpp文件。
其中TestDemo_Cls.h的内容是
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class pacmanDemo_Cls */
#ifndef _Included_pacmanDemo_Cls
#define _Included_pacmanDemo_Cls
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: pacmanDemo_Cls
* Method: clear
* Signature: ()V
*/
// 下边这一句要复制到Cls.cpp中
JNIEXPORT void JNICALL Java_pacmanDemo_Cls_clear
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
所以Cls.cpp大概是这个样子的
#include "jni.h"
#include "pacmanDemo_Cls.h"
#include <stdio.h>
#include <stdlib.h>
JNIEXPORT void JNICALL Java_pacmanDemo_Cls_clear(JNIEnv *, jobject) {
system("cls");
}
5.生成->生成解决方案,得到ClsCPP.dll,然后把它复制到jre文件夹的bin文件夹下。
第三步:运行Java调用DLL程序
cmd进入产生TestDemo所在的目录。
执行命令:java TestDemo/Main
然后Helloworld被删除