免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1745 | 回复: 0
打印 上一主题 下一主题

JNI 之 HelloWorld [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-28 13:01 |只看该作者 |倒序浏览
本文转自:
http://opensourceforce.org/myhome/space.php?uid=481&do=blog&id=7479

    选择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++函数,传递等。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/78343/showart_2061847.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP