目录结构:

|-HelloWorld
|--src
|---main
|----java
|-----main.java
|----cpp //和java目录同级
|----CMakeLists.txt //cmake配置文件
|-----src // c\c++ 源文件目录
|------HelloWorld.cpp
|-----build // 生成文件目录
|-----include //头文件目录
|-----lib //依赖文件目录

创建java程序:

public class HelloWorld {
//静态加载库文件
// 需要注意load方法需要提供完整的路径, loadLibrary 只需要提供名称就可以了,可以自动加载.class文件夹下的对应名称的dll文件
//    static {
//        System.loadLibrary("native"); 
//        System.load(System.getProperty("user.dir") + "\\..\\cpp\\build\\native.dll"); 
//    }

    //库文件提供的方法
    public native void printHelloWorld();

    public static void main(String[] args) {
        //动态加载库文件
        System.load("C:\\Users\\djatm\\Desktop\\temp\\JNIHelloWorld-main\\src\\main\\cpp\\build\\libnative.dll");
       
        HelloWorld helloWorld = new HelloWorld();
         //调用提供的方法
        helloWorld.printHelloWorld();
    }
}

 然后用cmd切换到HelloWorld.java 的目录下执行命令:

javac -h . HelloWorld.java

生成文件:

 将生成的HelloWorld.h 放入到 cpp下面的 include目录 并 实现相应方法

#include <jni.h> // 引入Java预定义宏
#include <iostream>
#include "HelloWorld.h" //生成的头文件

void sayHello(){
  std::cout << "Hello from C++ !!" << std::endl;
}
JNIEXPORT void JNICALL Java_HelloWorld_printHelloWorld
  (JNIEnv* env, jobject thisObject) {
    sayHello();
}

并配置CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
 set(CMAKE_CXX_STANDARD 11)
 project(test)

 set(SRC src/HelloWorld.cpp) # 配置cpp源文件到SRC变量中

 set(EXECUTABLE_OUTPUT_PATH ./build) #配置输出目录

 set(JAVA_HOME $ENV{JAVA_HOME}) #获取系统环境变量中的JAVA_HOME并设置到JAVA_HOME 变量中

 include_directories( #引入的头文件位置
	include
	${JAVA_HOME}/include
	${JAVA_HOME}/include/win32
	 )

 add_library(native SHARED ${SRC}) #生成动态库

 cmd切换到cpp的build目录运行命令:

cmake .. -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -G "MinGW Makefiles" -DCMAKE_MAKE_PROGRAM=C:/mingw64/bin/make.exe

然后执行命令

make

得到dll文件:

最后执行

 posted on 2024-07-15 01:32  laremehpe  阅读(2)  评论(0编辑  收藏  举报