编写Java本地方法
在Windows系统上
- 编写java类,声明native方法
- 使用下列命令,获得native方法的头文件,暂且将该文件称为native.h
javac -h -jni lc/detect/face/FaceDetection.java - 使用VS 2019创建dll工程
- 在工程属性页中添加下列包含目录
[jdk目录]/include
[jdk目录]/include/win32 - 在工程中引入native.h文件
- 在dllmain.cpp中实现native.h中的函数
- 进行“生成”
- 将.dll文件放在java.library.path下,或环境变量Path下,然后使用System.loadLibrary(“库名字(不带.dll后缀)”)加载库
- 或者使用System.load(“库的绝对路径名”)加载库
- 调用本地方法
可能遇见的问题
- 无法打开 源 文件 jni_md.h
解:将#include "jni_md.h"改成#include “win32/jni_md.h” - jstring和string的转换
std::string jstring2string(JNIEnv* env, jstring jStr) {
const char* cstr = env->GetStringUTFChars(jStr, NULL);
std::string str = std::string(cstr);
env->ReleaseStringUTFChars(jStr, cstr);
return str;
} - 在java代码中加载库时,出现Can’t find dependent libraries
解:库的位置不正确 - 加载库时,出现“无法初始化库”
解:
dll文件出错,可能是dllmain.cpp中的入口点函数被删去了。入口点函数一般是BOOL APIENTRY DllMain()。
另外只有导出函数可以被外部调用,导出函数使用__declspec(dllexport)修饰。