JNI实现Java调用C++函数

1. 测试环境

  • 操作系统:win10
  • JDK版本:JDK11 安装教程
  • gcc版本:8.1.0

2. 声明native方法

// HelloJNI.java
public class HelloJNI {
    // 输出Hello JNI from CPP. 
    private native static void sayHello();
    // 实现两个整数相加
    private native static int add(int a, int b);

}

3. 生成头文件

javac -h ./ HelloJNI.java

注1:jdk10开始,javah被融合到javac中,使用javac -h替代javah
注2:"./"与"HelloJNI.java"之间需要用空格分开
注3:如果java文件中存在中文注释,可添加编码规则 javac -encoding utf-8 -h ./ HelloJNI.java

// 生成的HelloJNI.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloJNI
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
  (JNIEnv *, jclass);

/*
 * Class:     HelloJNI
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_HelloJNI_add
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

4. 创建C++文件

// HelloJNI.cpp
#include "HelloJNI.h"
#include <iostream>


JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jclass) {
    std::cout << "Hello from cpp." << std::endl;
}


JNIEXPORT jint JNICALL Java_HelloJNI_add(JNIEnv *, jclass, jint a, jint b) {
    return a + b;
}

5. 生成动态链接库ddl

g++ -o hello.dll -fPIC -shared -I"D:\java\jdk11\include\win32" -I"D:\java\jdk11\include" HelloJNI.cpp

注:两个-I参数的路径需要修改成对应的jdk安装路径

6. 调用C++函数

// HelloJNI.java
public class HelloJNI {
    static {
        // 加载C++文件生成的动态链接库
        // hello为生成的动态链接库名称hello.dll
        System.loadLibrary("hello");
    }


    // 输出Hello JNI from CPP. 
    private native static void sayHello();
    // 实现两个整数相加
    private native static int add(int a, int b);


    public static void main(String[] args) {
        // 调用hell函数
        HelloJNI.sayHello();
        // 调用add函数
        int res = HelloJNI.add(1, 2);
        System.out.println("res = " + res);
    }
}

7. HelloJNI.java运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

it00zyq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值