java调用C++ DLL库方法-阿里云开发者社区

开发者社区> maojunxu> 正文

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程序即可。结果如下:

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
python java 调用
    jar 包下载 jython jython 2.1     实例 package com.curiousby.python.demo; import org.
818 0
使用thrift做c++,java和python的相互调用
linux上安装thrift见 http://jinghong.iteye.com/blog/1102535 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点;代码侵入较强是其弱点。
807 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
7436 0
regsvr32 注册.dll的用法
在cmd窗口或者开始→运行中输入下面两个命令:Regsvr32 C:\Program Files (x86)\Environment.dll 或 Regsvr32 C:\\Program Files (x86)\\Environment.dll均提示下面的错误:RegSvr32 [Content] 模块“C:\ProgramFiles(x86)\Environment.dll”加载失败。
978 0
Action的动态调用方法
Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法: 1、 方法一(通过methed属性指定执行方法): 可以在配置文件中配置Action的时候用method=来指定执行哪个方法             /user_add_success.jsp     这样,只要在action的对象中有一个add的方法,并且返回类型为String就可以了。
535 0
Java调用R与Python
Java调用R与Python
4027 0
C#调用C函数(DLL)传递参数问题
备忘: 1.C函数参数为字符串char*。如果是入参,对应C#中string或StringBuilder;如果是出参对应C#中StringBuider;   2.C函数参数为结构体指针,需在C#中对应定义结构体。
873 0
+关注
467
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载