本文章仅作为个人笔记
-
创建调用jni的java类
package www.mys.com.sbjni.utils; public class NativeUtils { static { System.loadLibrary("NativeUtils"); } public static void main(String[] args) { String jniStr = getJniStr(); System.out.println("jniStr=" + jniStr); } public static native String getJniStr(); }
-
生成相应的class文件和jni头文件,并把头文件移动到native文件夹内
mkdir src/main/native mkdir src/main/native/inc mkdir src/main/native/src cd src/main/java javac www/mys/com/sbjni/utils/NativeUtils.java javah www.mys.com.sbjni.utils.NativeUtils mv com_mys_com_sbjni_utils_NativeUtils.h ../native/inc/NativeUtils.h rm www/mys/com/sbjni/utils/NativeUtils.class
-
在src/main/native/src创建相应.cpp文件
#include "NativeUtils.h" JNIEXPORT jstring JNICALL Java_www_mys_com_sbjni_utils_NativeUtils_getJniStr (JNIEnv *env, jclass type) { return env->NewStringUTF("This is jniStr."); }
-
在src/main/native创建CMakeLists.txt文件
cmake_minimum_required(VERSION 3.6) project(NativeUtils) set(CMAKE_CXX_STANDARD 14) file(GLOB CORE_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/inc ) if (CMAKE_SYSTEM_NAME MATCHES "Windows") message("system is windows.") include_directories( $ENV{JAVA_HOME}/include $ENV{JAVA_HOME}/include/win32 ${CORE_INCLUDE_DIRS} ) else () message("system is not windows.") include_directories( $ENV{JAVA_HOME}/include $ENV{JAVA_HOME}/include/linux ${CORE_INCLUDE_DIRS} ) endif () add_library(NativeUtils SHARED src/NativeUtils.cpp ) target_link_libraries(NativeUtils)
-
环境搭建
-
windows
安装cmake
在msys官网下载站相应文件安装(若安装了vs可不安装)
-
打开 ming64.exe 执行
pacman --noconfirm -Syu
pacman --noconfirm -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake
pacman --noconfirm -S mingw-w64-x86_64-extra-cmake-modules make tar
pacman --noconfirm -S mingw64/mingw-w64-x86_64-cyrus-sasl
-
添加环境变量
- %MSYS_HOME%\usr\bin
- %MSYS_HOME%\mingw64\bin
-
-
windows 下打.dll 文件
-
命令行执行
mkdir build cd build cmake ..
-
使用 Visual Studio 打开生成的 NativeUtils.sln
选择 Release x64 对 ALL_BUILD 进行生成,将生成的 NativeUtils.dll 复制至导入libs的路径
对CMake不熟悉的可以借鉴
-
linux 下打.so 文件
-
命令行执行
mkdir build cd build cmake .. make
将生成的native/build/libNativeUtils.so文件复制至导入libs的路径
普通运行需要添加 -Djava.library.path=<libs的路径> 参数,但是真实生产环境可能不方便这么处理,因此在InitJob及NativeUtils处理相关。
-
本人创建一github demo,有需求可自行查看借鉴。