Java调用Native方法。

定义native方法

在Java程序中,定义native方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 本地方法
*
* @author zhangguofeng
* @version 1.0
* @date 2021/12/6
*/
public class HelloNative {
/** 回显字符串*/
public native String echoStr(String msg);
/** 两数相加*/
public native int add(int a, int b);

}

然后编译这个Java文件,然后使用命令生成对应的C++程序。

1
javah.exe -jni -classpath . com.abumaster.HelloNative

生成C++的头文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_abumaster_HelloNative */

#ifndef _Included_com_abumaster_HelloNative
#define _Included_com_abumaster_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_abumaster_HelloNative
* Method: echoStr
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_abumaster_HelloNative_echoStr
(JNIEnv *, jobject, jstring);

/*
* Class: com_abumaster_HelloNative
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_abumaster_HelloNative_add
(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

我们,需要使用C++实现这个头文件即可。

C++实现native方法

使用C++的编辑器如CLion新建一个动态库的工程。
将Jdk的include目录拷贝到项目中,如

将上述生成的头文件放到library.h中,并在C++源文件中实现两个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "library.h"

#include <iostream>

/*
* Class: com_abumaster_HelloNative
* Method: echoStr
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_abumaster_HelloNative_echoStr
(JNIEnv *, jobject, jstring msg) {
return msg;
}

/*
* Class: com_abumaster_HelloNative
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_abumaster_HelloNative_add
(JNIEnv *, jobject, jint a, jint b) {
return a+b;
}

然后编辑CMakeLists构建文件:

1
2
3
4
5
6
7
8
cmake_minimum_required(VERSION 3.16)
project(HelloNative)

set(CMAKE_CXX_STANDARD 11)
include_directories(include)
include_directories(include/win32)

add_library(HelloNative SHARED library.cpp library.h)

构建项目,生成HelloNative.dll文件。

直接调用

HelloNative.dll文件,拷贝到Java项目的根路径下,使用System.loadLibrary("HelloNative");进行加载,然后像使用Java对象一样,调用即可,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.abumaster;


/**
* 使用
*
* @author zhangguofeng
* @version 1.0
* @date 2021/12/6
*/
public class UsageNativeDll {
// 加载动态库
static {
System.loadLibrary("HelloNative");
System.out.println("dll 加载成功!");
}

public static void main(String[] args) {
// 实例对象
HelloNative helloNative = new HelloNative();
// 调用方法
System.out.println(helloNative.add(3,3));
System.out.println(helloNative.echoStr("hello native method"));

}
}