选择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++函数,传递等。
阅读(1400) | 评论(0) | 转发(0) |