Java调用JNI方法
1.编译java文件为头文件
JDK8
- 编写Java文件并使用javac编译成class文件
- 使用 javah . xx.class 编译成 头文件(注意第一个. 后面是空格)
:::tips
javah -classpath . ex1.ZLThread
:::
JDK8以上
- 使用javac -h . xx.java 直接编译成 头文件 java文件要放在所对应的包名字相同的文件夹内
查看生成的头文件,复制JNICALL 后面的方法名 包含方法签名JNIEXPORT void JNICALL Java_ex1_ZLThread_start1
然后将我们自己编写的.c 文件中的start1()方法名改成刚刚复制的方法名,方法参数是固定的,方法参数为:(JNIEnv *env, jobject c1)
2. 编译这个 .c 文件为一个so文件,这样才能被java程序加载到
gcc -fPIC -I /home/shadows/soft/jdk11/include -I
home/shadows/soft/jdk11/include/linux -shared -o libxxx.so tnew.c
注意这个libxxx; lib是固定的xxx可以随意,但是得和你的java代码对应

编译so库文件
:::tips
gcc -fPIC -I /usr/java/jdk1.8.0_191/include -I /usr/java/jdk1.8.0_191/include/linux/ -shared -o libEnjoyThreadNative.so tnew.c
:::
3.将so所在目录添加到环境变量
:::tips export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/tlc/test :::
4.运行我们的代码
最后运行我们前面写好的那个java文件(记得到包的外面去运行java命令)
java ex1.ZLThread
ZLThread.java
package ex1;public class ZLThread {public native void start1();static {System.loadLibrary( "EnjoyThreadNative" );}public static void main(String[] args) {ZLThread zlThread = new ZLThread();zlThread.start1();}}
tnew.c 替换方法名前
//头文件#include <pthread.h>#include <stdio.h>//定义一个变量,接受创建线程后的线程idpthread_t pid;void *thread_entity(void *arg) {while (1) {usleep(100);printf("I am new Thread\n");}}start1() {pthread_create(&pid, NULL, thread_entity, NULL);while (1) {usleep(100);printf("I am main\n");}return 0;}
tnew.c 替换方法名后
//头文件
#include <pthread.h>
#include <stdio.h>
#include "ex1_ZLThread.h"
//定义一个变量,接受创建线程后的线程id
pthread_t pid;
void *thread_entity(void *arg) {
while (1) {
usleep(100);
printf("I am new Thread\n");
}
}
JNIEXPORT void JNICALL Java_ex1_ZLThread_start1(JNIEnv *env, jobject c1){
pthread_create(&pid, NULL, thread_entity, NULL);
while (1) {
usleep(100);
printf("I am main\n");
}
}
