什么是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