java开发第一个JNI示例程序(基于linux操作系统)--java调用native方法

来源:互联网 发布:韩国古代历史 知乎 编辑:程序博客网 时间:2024/06/07 22:41

大家都知道,通过jni可以实现java和c以及c++的交互,但是这对于新手来说,想实现自己的本地调用还是有一定困难,万事开头难,这里我将用一个最简单的程序向大家展示jni的真面目。

项目的基本流程:
1、新建java文件(JavaJNI.java)
2、编译java文件(JavaJNI.class)
3、生成c的头文件(JavaJNI.h)
4、新建c文件(javaJNI.c)
5、生成动态链接库(javaJNI.so)
6、运行java程序
第一步:首先建一个java 类,作用是加载库文件,调用本地方法,在任意位置新建文件夹java,在java文件夹下新建JavaJNI.java文件,代码如下:

public class JavaJNI {static{    System.load("//home//zhangmingbao//user//java//javaJNI.so");}public static void main(String[] args){    JavaJNI javaJNI = new JavaJNI();    javaJNI.printstr();    javaJNI.printstr("wo shi ben di diao yong ce shi");}//native的作用是申明该方法在本地实现的,与C或C++中的方法相对应native void printstr();native void printstr(String str);}

第二步:编译java程序,打开终端,进入刚新建的java目录,输入javac JavaJNI.java ,然后回车,然后在java目录下就可以看到JavaJNI.class了(环境变量哟,没配的可是执行不了的)

第三步:生成c头文件,在终端中输入javah JavaJNI,然后回车,就可以看到JavaJNI.h 了(注意:javah生成JavaJNI.h实际上是根据JavaJNI.class生成的,所以必须先对java源码进行编译,同时javah在执行时会自动为文件加上.class后缀名,所以执行时只需要.class文件名),打开JavaJNI.h,你会看到一下内容

/* DO NOT EDIT THIS FILE - it is machine generated *//*导入jni.h头文件,该文件位于${JAVA_HOME}/include"*//*和"${JAVA_HOME}/include/linux两个目录下*/#include <jni.h>/* Header for class JavaJNI */#ifndef _Included_JavaJNI#define _Included_JavaJNI#ifdef __cplusplusextern "C" {#endif/* * Class:     JavaJNI * Method:    printstr * Signature: ()V */ /*根据java中申明的本地方法形成的我们将要在C文件中实现的方法申明*/ /*JNIEnv *, jobject是两个公共参数,具体可自行百度*/JNIEXPORT void JNICALL Java_JavaJNI_printstr__  (JNIEnv *, jobject);/* * Class:     JavaJNI * Method:    printstr * Signature: (Ljava/lang/String;)V */ /*同上*/JNIEXPORT void JNICALL Java_JavaJNI_printstr__Ljava_lang_String_2  (JNIEnv *, jobject, jstring);#ifdef __cplusplus}#endif#endif

这是有系统自动生成的,至于都是什么请看注释,此文家最好不要修改。

第四步:编写C文件,在该目录下新建javaJNI.c,内部代码如下:

/*导入刚才生成的头文件*/#include "JavaJNI.h"#include <stdio.h>/*头文件中的方法实现,直接将头文件中的方法原型复制过来加以实现即可,注意添加形参变量,*/JNIEXPORT void JNICALL Java_JavaJNI_printstr__  (JNIEnv *env, jobject obj)  {    printf("%s\n","woshiwucanjni" );    return;  }JNIEXPORT void JNICALL Java_JavaJNI_printstr__Ljava_lang_String_2  (JNIEnv *env, jobject obj, jstring string)  {    const char *str = (*env)->GetStringUTFChars(env, string, 0);    printf("%s!\n", str);  }

第五步:编译共享库,我直接使用了make编译工具,至于make的介绍网上有很多,很NB的,大家自行百度,在java文件夹下新建Makefile文件,这是使用make编译时的识别文件,内容如下:

javajni.so:javajni.o    gcc -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux" -shared -o javajni.so javajni.ojavajni.o:javajni.c    gcc -I"${JAVA_HOME}/include" -I"${JAVA_HOME}/include/linux" -c -fPIC -o javajni.o javajni.c

在终端输入make然后回车就发现javaJNI.so已经生成了(windows需要生成javaJNI.dll).(可能会因为缺少插件而不能成功,不用怕,看输出信息,缺什么补什么)

第六步:执行java JavaJNI,完事。

注意:

System.load(这里是.so的绝对路径);
System.loadLibrary(这里是.so的文件名),系统会自动匹配,但是.so文件需要放在java.library.path路径中,该路径可以通过System.getProperty(“java.library.path”)查看,我也不是很懂,就不误导大家了;

0 0
原创粉丝点击