现在的位置: 首页 > 综合 > 正文

在java web项目中调用c++程序简单案例

2018年07月07日 ⁄ 综合 ⁄ 共 1794字 ⁄ 字号 评论关闭

一、在java web项目中调用c++程序简单案例

             这个是通过java调用通过jni技术调用c++的dll程序

          开始之前,首先了解一些jni是什么?:

                   JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,

                   它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,

                   只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。

                   但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。

                  JNI标准至少保证本地代码能工作在任何Java虚拟机实现下。

          案例如下:

     1、首先新建一个java web项目为proejct,然后编写一个java类,因为要使用jni来调用c++程序,因此该类中的方法名录需要用native修饰且只有方法声明,没有实现,

           如下:

     

package com.coffee.common;

public class FaceRecognition
{
	public native static String faceRecognition(String faceImgPath);
}

     2、在eclipse中使用javah命令来编译头文件;

              在elipse中点击【Run】-->【External Tools】-->【External Tools Configurations..】

               测试会弹出一个窗口然后选择【Program】右击新建,如图:

这样我们就可以在eclipse中使用doc环境进行编译,如图,并输入红框中的命令,然后回车,这样就完成了Javah编译:

     3、新建一个C++项目,使用VS工具,如图所示:(或者您也可以使用别的更好的方式)

   4、在新建的C++项目中加入必要的头文件

        JDK中两个h头文件:jni.h  jni_md.h两个文件的目录分别位于安装好的JDK目录下include与include/win32下

         然后在加入之前我们编译好的java头文件:

       将这三个文件拷贝到新建的C++项目下,然后添加到头文件夹中,这时我们可以新建一个C++源代码文件来

      编写我们的逻辑代码:如图所示的结构

        5、编写c++代码前准备工作

      打开使用javah编译好的头文件将   #include<jni.h>  更改为   #include "jni.h"

       并将该该h文件中的方法复制到FaceRecognition.cpp中,如图所示:

        然后为该c++项目生成解决方案,然后在该项目的Debug目录下找到face_recognition.dll文件,并将其拷贝到

     Tomcat安装目录的bin目录下。

    当然在使用native方法之前需要先将dll文件加载进来,此时我们可以在FaceRecognition类中添加加载方法

package com.coffee.common;

public class FaceRecognition
{
        static{
		System.loadLibrary("face_recognition");
	}
	public native static String faceRecognition(String faceImgPath);
}

      6、最后将带有native的方法在业务逻辑中进行调用,启动Tomcat,这样我们就可以进行访问调用了。

        

public class LoginServer{
    private FaceRecognition fr;
    
    public void login(){
         fr = new FaceRecognition();
         fr.faceRecognition("c:\\ddd");
    }
}

抱歉!评论已关闭.