第一次在cenos7下写jni程序,留作备忘
- 先创建一个jnidemo.java程序
public class jnidemo{
native void printHello();
static{
System.load("/home/liuzao/ldd3_examples/jnidemo/jnidemo.so"); //使用绝对路径
//System.loadLibrary("jnidemo"); //使用相对路径
}
public static void main(String[] args){
jnidemo myJni = new jnidemo();
myJni.printHello();
}
}
理解:要在c语言实现的函数前,需要加native关键字,c语言的函数保存在jnidemo.so的动态库中,
加载动态库有两种方法,一种是使用绝对路径,一种是使用相对路径,
- 将java程序使用javac编译,生成jnidemo.class文件
javac jnidemo.java
- 将java程序使用javah, 生成jnidemo.h文件
javah jnidemo
jnidemo.h文件如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnidemo */
#ifndef _Included_jnidemo
#define _Included_jnidemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jnidemo
* Method: printHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_jnidemo_printHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
- 编写c语言程序jnidemo.c
#include <stdio.h>
#include "jnidemo.h"
JNIEXPORT void JNICALL Java_jnidemo_printHello(JNIEnv *env, jobject object)
{
printf("This is c : hello\n");
return;
}
- 将c语言生成动态链接库.so文件
gcc -I /usr/java/jdk1.8.0_171/include/ -I /usr/java/jdk1.8.0_171/inlude/linux/ -fPIC -shared -o jnidemo.so jnidemo.c
- 运行java程序
java jnidemo
注意:每次修改完java代码,需要运行一次javac jnidemo
每次修改完c代码,需要编译一次动态链接库