JNI入门

来源:互联网 发布:狼人杀 for mac 编辑:程序博客网 时间:2024/05/19 09:14

环境配置:Centos6.4、jdk1.7.0_40

 

程序清单1:src/com/sample/jni/HelloWorld.java

package com.sample.jni;public class HelloWorld {   static {      System.loadLibrary("Hello");   }   public native void sayHello();   public static void main(String[] args){      new HelloWorld().sayHello();   }}

进入src目录,编译该Java类,命令如下:

javac ./com/sample/jni/HelloWorld.java

在src目录下使用javah生成头文件,命令如下:

javah -jni com.sample.jni.HelloWorld

生成com_sample_jni_HelloWorld.h头文件,C/C++程序就可以引用并实现其中的函数了。

 

程序清单2:com_sample_jni_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_sample_jni_HelloWorld */#ifndef _Included_com_sample_jni_HelloWorld#define _Included_com_sample_jni_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class:     com_sample_jni_HelloWorld * Method:    sayHello * Signature: ()V */JNIEXPORT void JNICALL Java_com_sample_jni_HelloWorld_sayHello  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

注意:此文件不需要编辑。

程序清单3:src/HelloWorldImpl.cpp

#include<jni.h>#include "com_sample_jni_HelloWorld.h"#include<stdio.h>JNIEXPORT void JNICALL Java_com_sample_jni_HelloWorld_sayHello(JNIEnv *env, jobject obj){printf("Hello World!\n");return;}

此C++文件实现了上述头文件中的函数。

注意:实现方法函数名要跟头文件中声明函数名一致。

 

编译生成动态库libHello.so,命令如下:

g++ -I /usr/local/jdk1.7.0_40/include/ -I /usr/local/jdk1.7.0_40/include/linux/ HelloWorldImpl.cpp -shared -o libHello.so -fPIC

成功执行后,会在src目录下生成动态链接库libHello.so。

说明:如果编译中出现一些奇怪的问题,可以参考 

Linux下使用JNI的常见问题及解决方案

 

最后,就可以运行Java调用JNI程序类的native方法了,命令如下:

java -Djava.library.path=.com.sample.jni.HelloWorld

输出:Hello World!  即表示成功!