Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1376182
  • 博文数量: 205
  • 博客积分: 6732
  • 博客等级: 准将
  • 技术积分: 2835
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-04 17:59
文章分类

全部博文(205)

文章存档

2016年(1)

2015年(10)

2014年(1)

2013年(39)

2012年(23)

2011年(27)

2010年(21)

2009年(55)

2008年(28)

我的朋友

分类: Java

2009-09-28 13:01:58

 
    选择Java是因为Java开发效率高并且跨平台(一次编译到处运行),当然不仅仅如此。但我们有时还是要调用操作系统的库函数,目前我在Linux操作系统下开发一个D-Lock(Desktop Lock)小项目就遇到了这样的问题,我需要用Java来调用Linux的系统函数chmod函数来修改文件的权限。当然在该项目中还是选择用纯C来开发D-Lock,正是因为用C开发后感觉用C开发的效率太低(当然这可能是个人对C不熟的原因),所以在开发完D-Lock 0.1 版本后从新思考了这些问题,因此想尝试一下使用JNI技术让Java有调用C/C++的能力。当然一旦你选择了JNI技术,也就失去了Java跨平台的意义。由于D-Lock本生就是针对Linux平台的,所以就无所谓跨平台了。、

    开发一个最简单的JNI程序需要一下几步:
    1、创建一个Java类该类中声明了 native 方法
    2、编译Java类生成.class文件
    3、用javah 命令生成 C/C++头文件
    4、对生成的头文件编写C/C++的实现
    5、将C/C++实现编译成共享库,在Linux下生成的.so文件,在Window下生成的就是.dll文件。
    6、在Java类中加在本地共享库并使用共享库

下面看一个简单的JNI之HelloWorld的例子
1、创建一个Java类该类中声明了 native 方法
package org.osforce;

public class NativeCode {

    public native void sayHello();  
   
}

2、编译Java类生成.class文件

3、用javah 命令生成 C/C++头文件
   我的工程在 /home/gavin/Jobs/workspace/NativeTest 目录
   .class 文件目录在 NativeTest/bin 原代码目录在 Native/src
   我们要通过.class类生成头文件,因此我们应该在.class目录下来执行 javah 命令
   在终端用 CD 命令进入到 /home/gavin/Jobs/workspace/NativeTest/bin
   然后执行 javah -jni org.osforce.NativeCode
   这样机会在  /home/gavin/Jobs/workspace/NativeTest/bin 目录下生成一个 org_osforce_NaticeCode.h
   的头文件
   下面是用 javah 命令生成的头文件内容
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class org_osforce_NativeCode */

#ifndef _Included_org_osforce_NativeCode
#define _Included_org_osforce_NativeCode
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     org_osforce_NativeCode
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_org_osforce_NativeCode_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

4、对生成的头文件编写C/C++的实现
    利用C/C++ IDE创建一个 library 工程,然后利用上一步生成的头文件编写具体C/C++的实现代码
下面是用C语言对上一步生成的头文件的实现
#include
#include "org_osforce_NativeCode.h"

JNIEXPORT void JNICALL Java_org_osforce_NativeCode_sayHello(JNIEnv *env, jobject obj)
{
    printf("Hello World From C Language!!!\n");
}

5、将C/C++实现编译成共享库,在Linux下生成的.so文件,在Window下生成的就是.dll文件。
    将编译好的共享库拷贝的 java.library.path 下,不知道 java.library.path 可以通过
    System.getProperty("java.library.path") 获得并打印查看一下就可以了。

6、在Java类中加在本地共享库并使用共享库
package org.osforce;

public class NativeCode {

    public native void sayHello();
   
    static {
       
        System.loadLibrary("nativetest");
    }
   
    public static void main(String[] args) {
        NativeCode nativeCode = new NativeCode();
        nativeCode.sayHello();
    }
   
}
运行结果 : Hello World From C Language!!!

一个最简单的JNI例子就是这样。
当然JNI不止这么简单,他还有很多内容,包括C/C++调用Java方法,Java调用C/C++函数,传递等。
阅读(1406) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~