java调用C++ DLL库方法

简介: 最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题。经过查找,实现了一个简单的例子。 1、第一步,先在Java中新建一个类     如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了。
+关注继续查看

最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是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,代码如下:

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

6 调用方法

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

目录
相关文章
|
7天前
|
机器学习/深度学习 Java 算法框架/工具
Java深度学习库DJL实现Python的NumPy
Java深度学习库DJL实现Python的NumPy
22 1
|
16天前
|
消息中间件 分布式计算 Java
大厂招聘重点全在这!GitHub置顶Java基础-高级面试库+自学路线
最近几年经常会听见这样一种声音:“程序员是吃青春饭的,年龄一大就不吃香了”,在当下这种互联网产业增速放缓,甚至隐约展现出疲态的时刻,此类言论就很有市场。 可能在其他领域中,程序员的发展前景不太乐观,但在Java这条赛道上,大家的前景还是很明朗的。入行Java也好几年了,我属于是半路出家,感觉做这一行很轻松,不会像以前做网络安全时那样感到焦虑与压力。 Java这一块,最看重的是技术与经验,只要是愿意学习勤钻研,在Java领域还是能吃得开。 至于收入方面,问了圈子里很多朋友,也结合我个人的实际情况,得出的结论是:平均每年能入60个左右,职位越高入得越多。这一行的高管几乎没有什么中年危
20 0
|
1月前
|
供应链 前端开发 JavaScript
Java开源进销存系统源码,支持手机APP扫码进出库
管店云主要应用于零售门店、商贸批发、生产工厂等行业领域,并可定制开发以满足各行各业的特定需求。管店云包括电脑端和手机APP端,APP支持扫码进出库,操作非常方便。
63 0
Java开源进销存系统源码,支持手机APP扫码进出库
|
2月前
|
Java 关系型数据库 MySQL
java自动创建库和创建表和插入记录
java自动创建库和创建表和插入记录
|
4月前
|
存储 安全 Java
Java元组实现库javatuples详解
元组可以看作是不同类型对象的有序集合。 这些对象不一定以任何方式相互关联,但它们共同具有某种意义。
279 0
|
5月前
|
JSON 算法 前端开发
Java几种常用 JSON 库性能比较,哪家最强?
Java几种常用 JSON 库性能比较,哪家最强?
|
7月前
|
XML JavaScript Java
这是用Java进行XML解析的最佳库
这是用Java进行XML解析的最佳库
|
7月前
|
JSON 算法 Java
令牌认证机制(token),相关各类JWT库(java)
令牌认证机制(token),相关各类JWT库(java)
202 0
令牌认证机制(token),相关各类JWT库(java)
|
8月前
|
Java Linux 计算机视觉
全网首发:Java在LINUX上系统上加载OpenCV so库的范例代码
全网首发:Java在LINUX上系统上加载OpenCV so库的范例代码
234 0
|
8月前
|
Java Linux 计算机视觉
全网首发:Linux自带opencv库的JAVA调用失败/java.lang.UnsatisfiedLinkError:libopencv_ml.so.405: 无法打开共享对象文件
全网首发:Linux自带opencv库的JAVA调用失败/java.lang.UnsatisfiedLinkError:libopencv_ml.so.405: 无法打开共享对象文件
257 0
相关产品
云迁移中心
推荐文章
更多