zoukankan      html  css  js  c++  java
  • 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集合中List,Set以及Map等集合体系详解
    Rabbit-MQ-3 队列的属性和消息的属性
    RabbitMQ-1 基本概念和实现简单生产消费者
    ActiveMQ-3
    日期时间类
    字符串反转
    SpringBoot2.0+Shiro+MyBatisPlus权限管理系统
    Servlet+JSP+JDBC学生选课系统
    SpringMVC+Spring+Hibernate个人家庭财务管理系统
    Servlet中FilterConfig的使用
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8523085.html
Copyright © 2011-2022 走看看