真机环境是 MacOS Big Sur 11.6.4
一、Java 代码编写、编译
- 首先把代码先编写完成
package top.acware.test;
public class HelloCpp {
public native void SayHello();
}
- 编写完成之后需要对代码进行编译,在 Idea 下直接打开命令行
- Win 环境的可以使用 Cmd 命令

- 执行命令:javac HelloCpp.java -h .
- 注意后面的 ‘.’ 是将编译后的文件放到当前路径下,可以修改到自己合适的位置
- 在项目下我会创建一个 lib 存放编译好的 .dll 文件,jni 存放编译出来的 .h 文件
- 编译完之后
- class 文件对目前来说没什么用,可以删除掉,把 .h 文件移到 jni 下

- class 文件对目前来说没什么用,可以删除掉,把 .h 文件移到 jni 下
二、C++ 代码编写、环境配置、dll 编译
- 这里需要用到 Java 的 jni.h 和 jni_md.h,我把他们复制到 jni 目录下
- 在 $JAVA_HOME/include 里有 jni.h,$JAVA_HOME/include/darwin 有 jni_md.h
- Win 环境下应该是 $JAVA_HOME/include/win32 目录下有 jni_md.h
- 在 $JAVA_HOME/include 里有 jni.h,$JAVA_HOME/include/darwin 有 jni_md.h

- 编写 C++ 代码
- 复制编译出来的 .h 文件,放到 lib 下修改后缀名为 .cpp
#include <jni.h>
#include <iostream>
#include <top_acware_test_HelloCpp.h>
using namespace std;
JNIEXPORT void JNICALL Java_top_acware_test_HelloCpp_SayHello
(JNIEnv *, jobject){
cout<<"CPP Say: Hello!"<<endl;
}

- dll 编译
- 同样的方式打开 Idea 的命令行(.cpp 文件下的路径),输入命令进行编译
- clang++ -I …/jni -shared -o top_acware_test_HelloCpp.dll top_acware_test_HelloCpp.cpp
- -I 是指定头文件在哪
- 我的 Mac 环境安装的是 clang++,也可以使用 gcc,只需要把 clang++ 改成 gcc 即可,命令是一样的
三、加载 dll 文件、运行程序
- 修改 Java 代码进行加载 dll 文件,然后运行即可
- 加载的位置看具体情况而定,不止这一种方法

- 加载的位置看具体情况而定,不止这一种方法

本文介绍如何在Java中通过JNI调用C++代码,包括Java代码编写、编译,C++代码编写、编译成dll,以及在Java中加载并运行dll文件的全过程。
1218

被折叠的 条评论
为什么被折叠?



