最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是 C++ 版,但是网页端要求使用 Java 后台,这就涉及到 Java 调用 DLL 的问题.经过查找,实现了一个简单的例子.
1,第一步,先在 Java 中新建一个类
如上图,其中注意这句 System.loadLibrary("javaCallcpp");,这就是加载 dll 文件的代码了.然后我们需要 dll 中实现下面定义的加减乘除方法.
2,编译文件,文件名为 Java2cpp.java,首先编译成 class 文件,如果用的是 eclipse,这个文件已经自动生成了,在工程目录下的 bin 文件夹下.用命令行编译,打开 cmd 窗口,cd 到. java 文件所在目录,执行命令 javac Java2cpp.java,即生成 Java2cpp.class
然后执行命令 javah Java2cpp 生成 Java2cpp.h 头文件,但是这一步往往会失败,另一种方法可以成功,进入 eclipse 项目的目录,进入 bin 文件夹,执行命令 javah -classpath . -jni 包名. 类名 (com.test.jni.Java2cpp), 然后生成了 com_test_jni_Java2cpp.h
3,在 VS 中新建项目 win32 项目,命名为:TestJNI 第二步选择如下:
4,把第二步生成的头文件拷进项目文件夹,然后导入.
5,实现头文件中的方法:
(1)新建头文件 dllApi.h, 代码如下:
(2)新建 dllApi.cpp 实现上述方法,代码如下:
#include "com_test_jni_Java2cpp.h"
int DLL_API_ADD(int a, int b);
int DLL_API_SUB(int a, int b);
int DLL_API_MUL(int a, int b);
int DLL_API_DIV(int a, int b);
#include "stdafx.h"
#include <iostream>
#include "dllApi.h"
int DLL_API_ADD(int a, int b)
{
return (a + b);
}
int DLL_API_SUB(int a, int b)
{
return (a - b);
}
int DLL_API_MUL(int a, int b)
{
return (a*b);
}
int DLL_API_DIV(int a, int b)
{
return (a / b);
}
(3)在 TestJNI.cpp 中添加代码实现 com_test_jni_Java2cpp.h 方法,添加完之后代码如下:
// TestJNI.cpp : 定义 DLL 应用程序的导出函数.
//
#include "stdafx.h"
#include "TestJNI.h"
#include "com_test_jni_Java2cpp.h"
#include "dllApi.h"
// 这是导出变量的一个示例
TESTJNI_API int nTestJNI=0;
// 这是导出函数的一个示例.
TESTJNI_API int fnTestJNI(void)
{
return 42;
}
// 这是已导出类的构造函数.
// 有关类定义的信息,请参阅 TestJNI.h
CTestJNI::CTestJNI()
{
return;
}
JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1ADD(JNIEnv *env, jobject obj, jint a, jint b){
int var = 0;
var = DLL_API_ADD(a, b);
return var;
}
JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1SUB(JNIEnv *env, jobject obj, jint a, jint b){
int var = 0;
var = DLL_API_SUB(a, b);
return var;
}
JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1MUL(JNIEnv *env, jobject obj, jint a, jint b){
int var = 0;
var = DLL_API_MUL(a, b);
return var;
}
JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b){
int var = 0;
var = DLL_API_DIV(a, b);
return var;
}
(4)生成 dll,在项目文件夹下的 Debug 文件夹内可以找到 TestJNI.dll,但是因为我们在 Java 里要求 dll 名为 JavaCallcpp,所以此时把项目重命名为 JavaCallcpp,然后重新生成 JavaCallcpp.【这一步生成会失败,按照如下添加路径】
6 调用方法
把第五步生成的 JavaCallcpp.dll 拷进 JRE 安装路径下的 bin 文件夹内,运行 java 程序即可.结果如下:
来源: http://click.aliyun.com/m/40091/