中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > J2SE
JNI开发简单入门篇
作者:未知 时间:2005-07-24 21:13 出处:JR 责编:chinaitpower
              摘要:JNI开发简单入门篇
(文章假使你已经有了DLL基本知识)
作者:桂静秋

前言


在有的时候根据项目的需要不可以避免用到本地的东西,最常见的就是java想访问Window本地的东东,比如想调节鼠标移动速度、改变窗体底色、甚至用javaApplet做个基于windows的远程控制象pcanywhere那样,怎么办?下面就用个最简单的例子来入门。

步骤


  • 写一个HelloWorld.java

    1. class HelloWorld {
    2.     public native void displayHelloWorld();//定义本地方法
    3.     static {
    4.         System.loadLibrary("hello");//调入本地库
    5.     }
    6.     
    7.     public static void main(String[] args) {
    8.         new HelloWorld().displayHelloWorld();
    9.     }
    10. }

    以上代码看起来好象和以前写的有点区别,出现了native关键字,但是不用太深究,你可以把这段代码看成是调用本地库的桥。
    然后java HelloWorld.java生成HelloWorld.class
  • 生成C的头文件

  • 很简单,就用jdk提供的javah命令, javah HelloWorld.class(注意,如果运行出错就把classpath指向class)
    成功运行后会出现HelloWorld.h
    1. /* DO NOT EDIT THIS FILE - it is machine generated */
    2. #include <jni.h>
    3. /* Header for class HelloWorld */
    4. #ifndef _Included_HelloWorld
    5. #define _Included_HelloWorld
    6. #ifdef __cplusplus
    7. extern "C" {
    8. #endif
    9. /*
    10.  * Class:     HelloWorld
    11.  * Method:    displayHelloWorld
    12.  * Signature: ()V
    13.  */
    14. JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
    15.   (JNIEnv *, jobject);
    16. #ifdef __cplusplus
    17. }
    18. #endif
    19. #endif

  • 编写C文件并编译成DLL

    1. #include <jni.h>
    2. #include "HelloWorld.h"
    3. #include <stdio.h>
    4. #include <windows.h>
    5. JNIEXPORT void JNICALL
    6. Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
    7. {
    8.     printf("Hello world!\n");//在这里实现java类中定义的方法
    9.     MessageBeep(0);//调用到win本地,会发一声响
    10.     return;
    11. }

    文件名随便取,主要扩展名.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,因为前面的
    1. System.loadLibrary("hello");//调入本地库

  • 运行

  • java HelloWorld
    屏幕会打印Hello world!而且伴着Beep一声。你成功了!
    如果运行出现
    1. Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.libr
    2. ary.path
    3.         at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1410)
    4.         at java.lang.Runtime.loadLibrary0(Runtime.java:772)
    5.         at java.lang.System.loadLibrary(System.java:832)
    6.         at HelloWorld.<clinit>(HelloWorld.java:5)

    那就考虑hello.dll的路径,一般放在和class同个目录就行了。
  • 废话

  • 上面只是一道门,大家都知道C可以在windows上干什么?那这道门就可以干什么。
    新年快乐,祝JR越来越多人!
    关闭本页
     
    首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
    Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有