Java Native Interface JDK8使用JNI 示例

Java Native Interface JDK8 JNI 示例

使用Java Native Interface (JNI)可以让Java程序调用本地(C/C++)代码。以下是一个示例,通过创建一个简单的JNI应用程序来演示如何使用JNI在JDK8中调用本地代码。

1. 创建Java类

首先,创建一个Java类,声明一个本地方法。

public class HelloWorld {
    // 声明一个本地方法
    public native void printHelloWorld();

    static {
        // 加载本地库
        System.loadLibrary("HelloWorld");
    }

    public static void main(String[] args) {
        new HelloWorld().printHelloWorld();
    }
}

2. 生成C/C++头文件

编译Java类并生成对应的C/C++头文件。

# 编译Java类
javac HelloWorld.java

# 生成C/C++头文件
javah -jni HelloWorld

需要注意,需要在java目录下,通过全限定类名的形式生成c代码的头文件

# 生成C/C++头文件
javah -jni com.dolphin.HelloWorld

生成的com_dolphin_HelloWorld.h头文件应该包含以下内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_dolphin_HelloWorld */

#ifndef _Included_com_dolphin_HelloWorld
#define _Included_com_dolphin_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_dolphin_HelloWorld
 * Method:    printHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_dolphin_HelloWorld_printHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

3. 编写C/C++实现

创建一个对应的C/C++实现文件HelloWorld.c

#include <jni.h>
#include <stdio.h>
#include "com_dolphin_HelloWorld.h"

// 实现printHelloWorld方法
JNIEXPORT void JNICALL Java_com_dolphin_HelloWorld_printHelloWorld(JNIEnv *env, jobject obj) {
    printf("Hello, World from C!");
}

4. 编译C/C++代码

使用gcc或其他编译器编译C/C++代码,生成动态链接库。
安装gcc 参考我的这篇帖子
https://blog.csdn.net/qq_35977117/article/details/139070603

# 在Windows上生成dll
gcc -shared -o HelloWorld.dll -I"%JAVA_HOME%\\include" -I"%JAVA_HOME%\\include\\win32" HelloWorld.c

# 在Linux上生成so
gcc -shared -o libHelloWorld.so -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" HelloWorld.c

# 在MacOS上生成dylib
gcc -dynamiclib -o libHelloWorld.dylib -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" HelloWorld.c

5. 运行Java程序

确保生成的动态库位于Java的库路径中,然后运行Java程序。

把生成的jdk 放入 jdk 安装目录下的bin目录中,

C:\Program Files\Java\jdk1.8.0_241\bin

或者在path中配置dll lib的文件夹路径,也可以访问到。可以通过打印

System.out.println(System.getProperty("java.library.path"));

输出:

Hello, World from C!

在这里插入图片描述

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值