Java如何调用C++ 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程序即可。结果如下:

以上所述是小编给大家介绍的Java如何调用C++ DLL库的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • C++/java 继承类的多态详解及实例代码

    C++/java 继承类的多态详解 学过C++和Java的人都知道,他们二者由于都可以进行面向对象编程,而面向对象编程的三大特性就是封装.继承.多态,所有今天我们就来简单了解一下C++和Java在多态这方面的不同. 首先我们各看一个案例. C++ //测试继承与多态 class Animal { public: char name[128]; char behavior[128]; void outPut() { cout << "Animal" << endl

  • Java中对象与C++中对象的放置安排的对比

    Java中对象与C++中对象的放置安排的对比 概要: Java中,所有的对象都存放在堆(Heap,一种通用的内存池)中:而对象的引用是存放在堆栈(Stack)中的. 我们可以通过String直接声明的字符串与new String声明出来的字符串使用equals()和"=="进行的比较,从而理解对象和引用的关系及它们的存储位置. 堆栈是一种快速有效的分配存储方法,仅次于寄存器.创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针. 堆不同于堆栈的好处是:

  • C++和java设计模式之单例模式

    单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点.其构造过程由自身完成,可以将构造方法定义为private型的,这样外界就只能通过定义的静态的函数Instance()构造实例,这个函数的目的就是返回一个类的实例,在此方法中去做是否有实例化的判断.客户端不再考虑是否需要去实例化的问题,把这些都交给了单例类自身.通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法,就是让类自身负责保存它的唯一实例.这个类可以保证没有其他实例可

  • Java与C++实现相同的MD5加密算法简单实例

    1.Java版 package com.lyz.utils.common; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * MD5加密 * @author liuyazhuang */ public class MD5Hash { public static String md5

  • C/C++与Java各数据类型所占字节数的详细比较

    C/C++的数据类型: 一,整型 Turbo C:   [signed] int 2Byte//有符号数,-32768~32767   unsigned int 2Byte //无符号数,只能表示整数0~65535 [signed] short [int] 2Byte unsigned short [int] 2 Byte long [int] 4 Byte unsigned long [int] 4 Byte Visual C++ 6.0: [signed] int 4Byte   unsig

  • C/C++在Java、Android和Objective-C三大平台下实现混合编程

    Android和iOS开发都支持C++开发,可以一套代码多平台使用.同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行效率. 一.为什么使用C/C++ 便于移植,用C/C++写得库可以方便在其他的平台上再次使用. 代码的保护,由于java层代码很容易被反编译,而C/C++库反汇难度较大. 提高程序的执行效率,将要求高性能的应用逻辑使用C/C++开发,从而提高应用程序的执行效率. 访问现有开源库,需要访问底层的API或引用一些只有C/C++

  • Java如何调用C++ DLL库

    最近做了一个网页端人脸识别的项目,用c++写了人脸识别的算法,但是在网页端要使用java后台,这其中就涉及到了java调用dll的问题.下面是小编通过查阅相关资料,实现的一个简单例子. 1.第一步,先在Java中新建一个类 如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了.然后我们需要dll中实现下面定义的加减乘除方法. 2.编译文件,文件名为Java2cpp.java,首先编译成class文件,如果用的是eclip

  • 详解Python 调用C# dll库最简方法

    1.为什么要跨平台编程?双平台编程或多平台编程,只是为提供更好开发更兼容的解决方案的一种手段,编程时服务于产品和客户的,也是因地制宜. 先安装python所需的库clr ,我这里已经安装了,可以去对应的根目录下查看有没有pythonnet这个文件夹. 2.首先要特别注意,你安装使用的Python的版本是对应x64还是x32的,python只能调用对应64位或32位的dll,可以右击启动项目的属性,修改并重新生成. 特别注意:启动项目和你的目标库不一样,前者输出类型是windows应用或是控制台,

  • java中调用GDAL DLL的实现方法

    步骤:1.编译GDAL(编译过程忽略).2.将编译过后的动态链接库拷贝到{JAVA_HOME}\jre\bin目录下,如下图:   3.将编译过后的gdal.jar引入java工程,测试调用,代码如下: 复制代码 代码如下: @Override    protected boolean doIsAvailable() throws Throwable {        System.loadLibrary("gdaljni");        return true;    } 上面代

  • Java通过JNI 调用动态链接库DLL操作

    JNI(Java Native Interface)Java本地接口,主要作用是实现java代码与C.C++编写的代码交互. 在Android编程中,so库的访问也用到了jni技术. 理论多说无益,还是看java连接dll的实战吧.如下: 例:java中调用demo.dll文件中的 hello()方法. 1.java 1)装载dll文件 有两种方式System.load();和System.loadLibrary(); load需要全路径且需要有文件扩展名: loadLibrary是特定路径,系

  • Java通过调用C/C++实现的DLL动态库——JNI的方法

    由于项目的需要,最近研究了java 调用DLL的方法,将如何调用的写于此,便于日后查阅: 采用的方法是JNI: Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互. 下面是从网上摘取的JNI工作示意图: 总体说明:先在JAVA中建立一个类,通过javac生成.class,再由javah生成.h:然后将.h复制到VC下,由VC实现具体函, 并编译通过后生成DLL,将DLL放入JAVA工程中使用,完毕. 下面说说具体步骤(含实

  • 关于python调用c++动态库dll时的参数传递问题

    目录 string cv::Mat string C++生成dll代码: #include <iostream> extern "C" __declspec(dllexport) int get_str_length(char *str); int get_str_length(char *in_str) { std::string str(in_str); return str.length(); } 将VS_create_dll.dll放在与python相同文件夹下.p

  • ASP.NET/C#中如何调用动态链接库DLL

    动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现. 动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法.注:C#中一般称为"方法"),但这些函数不是执行程序本身的一部分,而是根据进

  • 从java中调用matlab详细介绍

    前段时间摸索了java调用matlab东西,不说学的有多深,也算有结果了,达到目的了.也即用java程序可以调用matlab中函数了. 按顺序说吧,最开始肯定是下个matlab看看.下哪一个呢.开始下一个7.0觉得很新了.后来才觉得不是,现在都有7.8了.同时网上还流传着另外一种版本号信息,即2006版. 2006a版.2008b版,后来从网上找资料才知道,原来,matlab是一年两版的,叫a版和b 版.比如MATLAB 7.2 (Release 2006a),我下的是m7.8即2009a版.网

  • Java实现调用jython执行python文件的方法

    本文实例讲述了Java实现调用jython执行python文件的方法.分享给大家供大家参考,具体如下: 在web开发时候,经常在web环境使用本地环境的第三方库什么的,本文讲解java如何执行python文件. 网上说方法有三种,其实也就两种,下面着中介绍第二种通过(jython). 方法一 java.lang.Runtime Runtime rt = Runtime.getRuntime(); try { Process proc = rt.exec("python /tmp/test.py&

  • C#调用C++dll方法步骤

    C#调用C++dll的方法和步骤 其他分享涉及到的概念和方法对于像我这样比较菜的选手看起来比较费劲并且很难抓住重点,这里我总结了一段时间的研究成果供初学者救济之用,简单明了. 1.新建项目->Visual C++->Win32项目 MyDLL 注意:C++编写的dll一般是不能直接拿来C#调用,需要先新建个C++的工程把dll里的方法重新封装成可被C#外部调用的函数. 2.MyDLL.cpp里的代码如下: extern "C" _declspec(dllexport)int

随机推荐