欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java如何调用C++ DLL库

程序员文章站 2024-03-12 17:52:20
 最近做了一个网页端人脸识别的项目,用c++写了人脸识别的算法,但是在网页端要使用java后台,这其中就涉及到了java调用dll的问题。下面是小编通过查阅相关资...

 最近做了一个网页端人脸识别的项目,用c++写了人脸识别的算法,但是在网页端要使用java后台,这其中就涉及到了java调用dll的问题。下面是小编通过查阅相关资料,实现的一个简单例子。

1、第一步,先在java中新建一个类

Java如何调用C++ DLL库

如上图,其中注意这句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第二步选择如下:

Java如何调用C++ DLL库

4、把第二步生成的头文件拷进项目文件夹,然后导入。

5、实现头文件中的方法:

(1)新建头文件dllapi.h,代码如下:

#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); 

(2)新建dllapi.cpp实现上述方法,代码如下:

#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。【这一步生成会失败,按照如下添加路径】

Java如何调用C++ DLL库

6 调用方法

把第五步生成的javacallcpp.dll拷进jre安装路径下的bin文件夹内,运行java程序即可。结果如下:

Java如何调用C++ DLL库

以上所述是小编给大家介绍的java如何调用c++ dll库的全部叙述,希望对大家有所帮助