image.png

Java调用JNI方法

1.编译java文件为头文件

JDK8

  1. 编写Java文件并使用javac编译成class文件
  2. 使用 javah . xx.class 编译成 头文件(注意第一个. 后面是空格) :::tips javah -classpath . ex1.ZLThread ::: image.png

    JDK8以上

  • 使用javac -h . xx.java 直接编译成 头文件 java文件要放在所对应的包名字相同的文件夹内

查看生成的头文件,复制JNICALL 后面的方法名 包含方法签名
JNIEXPORT void JNICALL Java_ex1_ZLThread_start1
image.png

然后将我们自己编写的.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代码对应
image.png
image.png
编译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
image.png


ZLThread.java

  1. package ex1;
  2. public class ZLThread {
  3. public native void start1();
  4. static {
  5. System.loadLibrary( "EnjoyThreadNative" );
  6. }
  7. public static void main(String[] args) {
  8. ZLThread zlThread = new ZLThread();
  9. zlThread.start1();
  10. }
  11. }

tnew.c 替换方法名前

  1. //头文件
  2. #include <pthread.h>
  3. #include <stdio.h>
  4. //定义一个变量,接受创建线程后的线程id
  5. pthread_t pid;
  6. void *thread_entity(void *arg) {
  7. while (1) {
  8. usleep(100);
  9. printf("I am new Thread\n");
  10. }
  11. }
  12. start1() {
  13. pthread_create(&pid, NULL, thread_entity, NULL);
  14. while (1) {
  15. usleep(100);
  16. printf("I am main\n");
  17. }
  18. return 0;
  19. }

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");
    }
}