Java JNI的使用(一)

什么是JNI

JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少要保证本地代码能工作在任何Java 虚拟机环境[ 来自于百科][1]

第一个JNI程序

Java 程序

首先创建以下程序

package com.lly;

public class CountNum {
    public native int addInt(int num1,int num2);//调用C++ int 相加
    public native double addDouble(double num1,double num2);//调用C++ double 相加
}

通过Javah 生成 h文件

生成h文件前,需要把CountNum类编译一下! 因为Javah 就是通过class(二进制文件) 来生成h文件
使用命令行(cmd)进入项目编译路径下如图
进入项目编译路径

使用命令
javah -classpath . -jni com.lly.CountNum

在当前目录生成一个com_lly_CountNum.h文件
在这里插入图片描述

C++ 程序

com_lly_CountNum.h文件

此文件自动生成出来的内容如下

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

#ifndef _Included_com_lly_CountNum
#define _Included_com_lly_CountNum
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_lly_CountNum
 * Method:    addInt
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_lly_CountNum_addInt
  (JNIEnv *, jobject, jint, jint);

/*
 * Class:     com_lly_CountNum
 * Method:    addDouble
 * Signature: (DD)D
 */
JNIEXPORT jdouble JNICALL Java_com_lly_CountNum_addDouble
  (JNIEnv *, jobject, jdouble, jdouble);

#ifdef __cplusplus
}
#endif
#endif

根据上面h文件,我在CLion 创建一个C++ library 项目
把上面com_lly_CountNum.h文件导进去
然后在创建一个com_lly_CountNum.cpp文件如下

com_lly_CountNum.cpp

//
// Created by lly on 2020/1/8.
//
#include "com_lly_CountNum.h"//引用上面导入的文件
#include <iostream>

JNIEXPORT jint JNICALL Java_com_lly_CountNum_addInt (JNIEnv *, jobject, jint int1, jint int2)//和上面一模一样
{
    int result = 0;
    std::cout << "======= start ======="<< std::endl;
    result = int1 + int2;
    std::cout << "=======  end  ======="<< std::endl;
    return result;
}

/*
 * Class:     com_lly_CountNum
 * Method:    addDouble
 * Signature: (DD)D
 */
JNIEXPORT jdouble JNICALL Java_com_lly_CountNum_addDouble (JNIEnv *, jobject, jdouble double1, jdouble double2)
{
    double result = 0.000000;
    printf("======= start =======");
    result = double1 + double2;
    printf("=======  end  =======");
    return result;
}

然后手动编译会生成两个文件
在这里插入图片描述

JNIDemo C++ 源码
JNIDemo Java 源码
[1]:https://baike.baidu.com/item/JNI/9412164?fr=aladdin

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

新星飞扬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值