1。编写一个java程序,包含一个native函数。
- package cn.vicky.jni;
- /**
- *
- * @author Vicky.H
- */
- public class HelloWorld {
- // 1.need a native method
- public native void sayHello();
- }
2。编译该java程序。
[root@localhost src]# tree
.
`-- cn
`-- vicky
`-- jni
`-- HelloWorld.java
3 directories, 1 file
[root@localhost src]# javac cn/vicky/jni/HelloWorld.java
[root@localhost src]# tree
.
`-- cn
`-- vicky
`-- jni
|-- HelloWorld.class
`-- HelloWorld.java
3 directories, 2 files
[root@localhost src]# javah cn.vicky.jni.HelloWorld
[root@localhost src]# tree
.
|-- cn
| `-- vicky
| `-- jni
| |-- HelloWorld.class
| `-- HelloWorld.java
`-- cn_vicky_jni_HelloWorld.h
3 directories, 3 files
如以上操作,将会生成一个对应的C/C++头文件。
3。编写C/C++动态文件库。
这里依旧使用netbeans+centos编写.so格式的动态文件库。工程目录如下:
其中cn_vicky_jni_HelloWorld.h为javah命令生成的头文件。jni.h以及jni_md.h为:
[root@localhost src]# cd /usr/java/default/include/
[root@localhost include]# tree
.
|-- classfile_constants.h
|-- jawt.h
|-- jdwpTransport.h
|-- jni.h
|-- jvmti.h
`-- linux
|-- jawt_md.h
`-- jni_md.h
1 directory, 7 files
拷贝对应的文件获得。
编写头文件的实现:cn_vicky_jni_HelloWorld_impl.cpp
- #include "cn_vicky_jni_HelloWorld.h"
- #include <iostream>
- using namespace std;
- JNIEXPORT void JNICALL Java_cn_vicky_jni_HelloWorld_sayHello (JNIEnv *env, jobject obj)
- {
- cout << "hello world" << endl;
- }
是一个简单的,输出“hello world”的程序。生成程序:获得libjni_01_cpp.so的动态链接库。为了只用该动态链接库,我们需要将其复制到/usr/lib文件下。
4。java调用libjni_01_cpp.so
继续编写HelloWorld.java程序
- package cn.vicky.jni;
- /**
- *
- * @author Vicky.H
- */
- public class HelloWorld {
- // 1.need a native method
- public native void sayHello();
- public static void main(String[] args) {
- System.loadLibrary("jni_01_cpp");
- new HelloWorld().sayHello();
- }
- }
[vicky@localhost src]$ javac cn/vicky/jni/HelloWorld.java
[vicky@localhost src]$ tree
.
|-- cn
| `-- vicky
| `-- jni
| |-- HelloWorld.class
| `-- HelloWorld.java
`-- cn_vicky_jni_HelloWorld.h
3 directories, 3 files
[vicky@localhost src]$ java cn.vicky.jni.HelloWorld
hello world
程序执行,完成。删除测试使用的动态链接库:
[root@localhost src]# rm /usr/lib/libjni_01_cpp.so
rm:是否删除 一般文件 “/usr/lib/libjni_01_cpp.so”? y
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上为linux下的jni使用,至于windows下,大体相同,当生成jni_01_cpp.dll文件后,我们需要将jni_01_cpp.dll所在目录的地址,宝贝到windows环境的path下。如:
然后,使用运行HelloWorld程序。