Java调用Native方法。
定义native方法
在Java程序中,定义native方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
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
| #include <jni.h>
#ifndef _Included_com_abumaster_HelloNative #define _Included_com_abumaster_HelloNative #ifdef __cplusplus extern "C" { #endif
JNIEXPORT jstring JNICALL Java_com_abumaster_HelloNative_echoStr (JNIEnv *, jobject, jstring);
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>
JNIEXPORT jstring JNICALL Java_com_abumaster_HelloNative_echoStr (JNIEnv *, jobject, jstring msg) { return msg; }
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;
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"));
} }
|