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

大家都知道,通过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 __cplusplus
extern "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.o
javajni.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”)查看,我也不是很懂,就不误导大家了;

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值