ubuntu 18.04
实验前检查环境配置,确保 java编译运行版本一致
sudo update-alternatives –config java
sudo update-alternatives –config javac
JNI -HelloWorld 实验过程步骤
- 编写一个类(HelloWorld.java),并申请native方法
- 使用
javac
编译HelloWorld源文件。结果会得到一个HelloWorld.class
的文件 - 使用 javah -jni 来生成C的头文件并包含声明了native方法
- 编写c的源文件去实习native方法
- 将c文件编译生成dll或者so库
- 运行java程序,验证jni的调用
编写Java文件
//HelloWorld.java
class HelloWorld{
//申明的native方法
private native void print();
public static void main(String[] args){
new HelloWorld().print();
}
static {
//加载库文件 System.load("/home/jason/code/JNI/helloworld/HelloWorld.so");
}
}
~
编译java源文件
javac HelloWorld.java
之后将获得HelloWorld.class
生成C系头文件
javah -jni HelloWorld
可以获得HelloWorld.h 文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
编写HelloWorld cpp源文件
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *env, jobject obj){
printf("HelloWorld! From JNI\n");
return ;
}
* 生成so文件*
cpp文件里的jni.h 提示找不到
需要指定文件路径 -I
gcc -I /usr/lib/jvm/default-java/include/ -I /usr/lib/jvm/default-java/include/linux/ HelloWorld.cpp -shared -o HelloWorld.so
-I : 编译路径添加
-shared :表示生成共享库
-o :生成可运行 二进制文件
修改java代码,加载库文件代码,指定到文件中
区分System.load(“XXXX”)和System.loadLibrary(“XXX”)方法
java HelloWorld 运行校验