青与鱼博客

@青与鱼

August 28th 2019 / 玩玩编程

jdk11的jni编程

首先写一个测试Class

public class JNIDemo {
    
    //定义一个方法,该方法在C中实现
    public native void testHello();
    
    public static void main(String[] args){
        //加载C文件
        System.loadLibrary("JNIDemo");//C的动态链接库的名字
        System.out.println("加载成功");
        JNIDemo jniDemo = new JNIDemo();//本测试类
        jniDemo.testHello();
    }

}

接下来就是生成头文件了

执行命令
**
javac -h jni JNIDemo.java

jni是文件存放目录,JNIDemo.java是测试类

**

头文件里面的内容

/* 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:    testHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_JNIDemo_testHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif



那么我们就实现这个C的函数

#include "JNIDemo.h"
 
JNIEXPORT void JNICALL Java_JNIDemo_testHello
  (JNIEnv *env, jobject obj)
{
    printf("Hello Jni\n");
    return;
}

接着编译并生成O文件

**
/home/pi/jdk-11/ 这个是JDK路径
./jni/JNIDemo.c 这个是我们刚刚写的C文件路径

gcc -c -fPIC -I /home/pi/jdk-11/include -I /home/pi/jdk-11/include/linux ./jni/JNIDemo.c -o JNIDemo.o

JDK路径可以用${JAVA_HOME}代替

**

我们还要生成SO文件
**
gcc -shared JNIDemo.o -o libJNIDemo.so

**

通知动态链接程序此共享文件的路径
export LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH

也可以把so文件复制到/usr/lib目录下

接着就可以正常编译java,并运行了
效果如图

发表评论
已登录为 [退出]


皖ICP备16001584号-2
x
皖ICP备16001584号-2