|
|
(文章假使你已经有了DLL基本知识) 作者:桂静秋
前言 在有的时候根据项目的需要不可以避免用到本地的东西,最常见的就是java想访问Window本地的东东,比如想调节鼠标移动速度、改变窗体底色、甚至用javaApplet做个基于windows的远程控制象pcanywhere那样,怎么办?下面就用个最简单的例子来入门。
步骤 写一个HelloWorld.java
- class HelloWorld {
- public native void displayHelloWorld();//定义本地方法
-
- static {
- System.loadLibrary("hello");//调入本地库
- }
-
- public static void main(String[] args) {
- new HelloWorld().displayHelloWorld();
- }
- }
以上代码看起来好象和以前写的有点区别,出现了native关键字,但是不用太深究,你可以把这段代码看成是调用本地库的桥。 然后java HelloWorld.java生成HelloWorld.class 生成C的头文件 很简单,就用jdk提供的javah命令, javah HelloWorld.class(注意,如果运行出错就把classpath指向class) 成功运行后会出现HelloWorld.h
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class HelloWorld */
-
- #ifndef _Included_HelloWorld
- #define _Included_HelloWorld
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: HelloWorld
- * Method: displayHelloWorld
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
- (JNIEnv *, jobject);
-
- #ifdef __cplusplus
- }
- #endif
- #endif
编写C文件并编译成DLL
- #include <jni.h>
- #include "HelloWorld.h"
- #include <stdio.h>
- #include <windows.h>
-
- JNIEXPORT void JNICALL
- Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
- {
- printf("Hello world!\n");//在这里实现java类中定义的方法
- MessageBeep(0);//调用到win本地,会发一声响
- return;
- }
文件名随便取,主要扩展名.c就可以。相信有C基础的人都可以明白以上的代码。 然后利用你拿手的工具,不管是BCB或VC++或者用命令行编译出DLL。 (java.sun.com里说Solaris用 cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris \ HelloWorldImp.c -o libhello.so windows VC用 cl -Ic:\java\include -Ic:\java\include\win32 -LD HelloWorldImp.c -Fehello.dll) 最后,DLL的文件名当然要是hello.dll,因为前面的- System.loadLibrary("hello");//调入本地库
运行 java HelloWorld 屏幕会打印Hello world!而且伴着Beep一声。你成功了! 如果运行出现
那就考虑hello.dll的路径,一般放在和class同个目录就行了。 废话 上面只是一道门,大家都知道C可以在windows上干什么?那这道门就可以干什么。 新年快乐,祝JR越来越多人! |
|