精华内容
下载资源
问答
  • java调用C++ 动态库方法

    千次阅读 2019-04-11 15:15:06
    最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题。经过查找,实现了一个简单的例子。 1、第一步,先在Java中新建一个类   ...

    摘要: 最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是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程序即可。结果如下:

    展开全文
  • Java调用C++动态库具体实现

    万次阅读 2017-10-11 14:19:50
    在我们编写java程序中经常会用到native方法,这些native方法就是用C或者C++编写的动态库方法,如何实现java调用这些方法,以下是根据自己的学习经验总结如下: 1.创建项目  首先在Eclipse中创建一个项目,创建两个...

    在我们编写java程序中经常会用到native方法,这些native方法就是用C或者C++编写的动态库方法,如何实现java调用这些方法,以下是根据自己的学习经验总结如下:

    1.创建项目

      首先在Eclipse中创建一个项目,创建两个类第一个类是HelloWorld.java 第二个类是TestDll.java,HelloWorld.java 代码中是你要创建的本地库方法,要用关键字native申明。例如:

    package com;
    
    public class HelloWorld {
    	public native void sayHello();
    
    }
    
    TestDll.java实现对此方法的调用
    

    public class TestDLL {

     public static void main(String[] args){ 

    System.loadLibrary("HelloWorld");    //加载的HelloWorld为动态库dll的名字。或者这一句放在HelloWorld.java中

    HelloWorld helloWorld = new HelloWorld(); 

    helloWorld.sayHello();

    }

    }

    2. 生成C/C++头文件

    在windows中打开一个命令窗口,进入jnitest工程所在目录下的bin目录如:D:\workspace\jnitest\bin。键入javah -classpath D:\workspace\jnitest\bin HelloWorld命令生成头文件HelloWorld.h。内容如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_HelloWorld */
    #ifndef _Included_com_HelloWorld
    #define _Included_com_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_HelloWorld
     * Method:    sayHello
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_com_HelloWorld_sayHello
      (JNIEnv *, jobject);

    #ifdef __cplusplus
    }
    #endif
    #endif

    注意不要修改此文件的代码

    3.编写本地方法实现

    用VC6创建HelloWorld Win32动态链接库工程。将上述生成的头文件HelloWorld.h拷贝到

    D:\Program Files\Microsoft Visual Studio\MyProjects\HelloWorld目录下面。

    将Java JDK下include目录下的jni.h和\include\win32\jni_md.h两个头文件拷贝到VC安装目录下的例如:D:\Program Files\Microsoft Visual Studio\VC\Include目录下面。在VC IDE中新建HelloWorld.cpp文件,实现头文件中声明的方法并编译生成DLL。

    创建DLL过程如下:

    .1.新建c++项目,win32控制台程序,命名为:MyDLL,解决方案为:MyDLLSolution.(根据自己项目情况命名)


    2.单击“下一步”,“应用程序类型”选择“DLL”,“附加选项”勾选“导出符号”,单击“完成”。


    3.单击“下一步”,在HelloWorld.cpp中编写实现java本地方法

    List4. HelloWorld.cpp源码

    #include "HelloWorld.h"

    #include <stdio.h>

    /*

    * Class: HelloWorld

    * Method: displayHelloWorld

    * Signature: ()V

    */

    JNIEXPORT void JNICALL Java_HelloWorld_sayHelloWorld (JNIEnv *, jobject)

    {

    printf("Hello World!\n");

    return;

    }

    4.点击生成——>生成解决方案


    在该项目根目录下的debug目录下会生成几个文件


    此时动态库文件生成成功,注意默认情况下生成的是32位dll文件,如果无法调用则需要配置生成64位,点击生成->配置管理->新建


    点击生成解决方案 在x64目录下的debug目录下可以找到dll文件

    4.运行测试程序

    先将生成的DLL拷贝到jnitest工程的D:\workspace\jnitest\bin下面,然后设置DLL搜索路径(在高级系统设置里面将dll文件路径添加到环境变量PATH)为D:\workspace\jnitest\bin(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可)。重新启动Elipse后,运行测试程序,将看到控制台输出“Hello World!”

    说明:JAVA调用native函数时,必须通过System.loadLibrary()或System.load将其native函数所在动态库 加载到虚拟机。并在运行时指明-Djava.library.path或-Dsun.boot.library.path,将其指向包含有native函 数的动态库所在位置。

    展开全文
  • 经过网上查找的资料和实践,可以在java界面中点击按钮调用C的程序将结果显示到java的文本框中,里面代码和步骤,祝你成功~~
  • 本篇文章主要记录如何使用JNI一步步完成Java调用C/C++类库,仅作学习记录,案例很简单,步骤也很明确,会通过详细截图的形式来进行演示。 JNI也就是Java Native Interface的简称,中文是“Java本地调用”。通常在...

    前言

    本篇文章主要记录如何使用JNI一步步完成Java调用C/C++类库,仅作学习记录,案例很简单,步骤也很明确,会通过详细截图的形式来进行演示。

    JNI也就是Java Native Interface的简称,中文是“Java本地调用”。通常在Java程序中的函数可以调用Native语言写的函数,Native一般指的是C/C++编写的函数。使用JNI的目的就是为了屏蔽不同操作系统平台的差异性,通过Java语言来调用Native语言的功能模块。

    但是总体来说,使用JNI开发很复杂,所以有大神就进行了封装,使用JNA,有兴趣的可以去学习一下。

    示例

    STEP - 1 : 新建Java工程,在Java类中声明native的方法
    这里写图片描述

    STEP - 2 : 在新建的项目中创建package,并且在包下创建一个Class(类)。
    这里写图片描述

    接下来,在该类中添加如下代码:

    public class JavaInvokeCPlus {
    
    	// 声明为native,表明是有外部来实现的
    	public native String returnHelloWorldToUpcase(String string);
    	public native void sayHelloWolrd();
    
    }
    

    STEP - 3 : 使用Javah命令生成native方法的声明的C/C++头文件
    1️⃣ 编译Java文件
    打开文件位置:右键Java文件 – Properties – Location – Show In System Explorer
    这里写图片描述

    按住shift键,同时在文件夹内空白处右击,选择“在此处打开命令窗口”,进入命令行【也可以使用其他方式进入到该目录下】。
    这里写图片描述

    编译:

    javac .\JavaInvokeCPlus.java
    

    这里写图片描述
    会在当前目录下生成一个.class文件

    **注意:**如果报错-错误:编码GBK的不可映射字符,解决办法:javac -encoding UTF-8 ./JavaInvokeCPlus.java

    2️⃣ 使用javah命令生成.h头文件

    javah -d E:\workspace\JavaInvokeCPlus\bin\cn\com\esu
    nny\jnitest -jni cn.com.esunny.jnitest.JavaInvokeCPlus
    

    这里写图片描述

    其中,javah中各个命令的意思是:

    -classpath <路径> 用于装入类的路径
    -d <目录> 输出目录
    -jni 生成 JNI样式的头文件(默认)

    注意事项:
    *1:我们的命令符的执行位置是源代码目录E:\workspace\JavaInvokeCPlus\src,否则会报错:未找到cn.com.esunny.jnitest.JavaInvokeCPlus 的类文件
    Maven工程是在src/main/java目录下操作

    *2:-jni 后面的路径是包名+类名
    *3:-jni 后面跟的文件的末尾不加上class后缀

    3️⃣ 打开输出目录,然后我们可以看到在bin目录下多了一个.h头文件。
    打开我们可以看到如下代码:
    这里写图片描述

    STEP - 4 : 使用VS2013生成DLL动态链接库文件
    1️⃣ 新建项目
    文件–新建–项目–Visual C++模块–Win32–Win32控制台应用程序–输入项目名称
    这里写图片描述

    应用程序选择DLL, 附加选项选择空项目 – 完成
    这里写图片描述

    2️⃣ 引入头文件

    一个是刚刚使用javah生成的头文件
    jni.h
    jni_md.h

    jni.h和jni_md.h这两个头文件需要在JDK中拷贝,博主这里使用的是JDK7的,现在将这三个头文件拷贝到C++工程的目录下。jdk的头文件在jdk的安装目录下,这两个文件的目录如下:

    jni.h               --  %JAVA_HOME%\include
    jni_md.h      		--  %JAVA_HOME%\include\win32
    

    VS2013项目工程目录结构如下:
    这里写图片描述

    然后将这三个头文件导入vs2013中:
    这里写图片描述

    修改编译产生的头文件的错误信息,将引入头文件的<>修改为"":
    这里写图片描述

    3️⃣ 实现接口方法
    源文件工程目录下新建一个cpp文件,引入编译产生的头文件

    #include<iostream>
    #include "cn_com_esunny_jnitest_JavaInvokeCPlus.h"
    #include <string>
    #include <cctype>
    #include <algorithm>
    using namespace std;
    
    /*
    * Class:     com_cjzheng_service_JavaInvodeCPlus
    * Method:    returnHelloWorldToUpcase
    * Signature: (Ljava/lang/String;)Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_com_cjzheng_service_JavaInvodeCPlus_returnHelloWorldToUpcase
    (JNIEnv *, jobject, jstring str) {
    	return str;
    }
    
    /*
    * Class:     com_cjzheng_service_JavaInvodeCPlus
    * Method:    sayHelloWolrd
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_com_cjzheng_service_JavaInvodeCPlus_sayHelloWolrd
    (JNIEnv *, jobject) {
    	cout << "Hello World" << endl;
    }
    

    4️⃣ 选择编译平台
    项目–属性–配置管理器–活动解决方案平台–新建–新建解决方案平台
    这里写图片描述

    5️⃣ 编译动态库
    右键项目 – 生成 – 控制台提示“========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========”
    这里写图片描述

    未完,待续

    展开全文
  • java项目开发的时候,可能会涉及调用第三方的接口,而第三方的接口提供方式不一定是以java类的方式提供,如果是C或C++开发的第三方系统,则一般以动态链接的方式提供,现在就讲一下java是如何调用动态链接的。...

    在java项目开发的时候,可能会涉及调用第三方的接口,而第三方的接口提供方式不一定是以java类的方式提供,如果是C或C++开发的第三方系统,则一般以动态链接库的方式提供,现在就讲一下java是如何调用动态链接库的。比较流行的方法有jni和jawin, 后者是开源组织提供的封装库,相对调用简单,不需要懂得C或C++的编程方式。这里主要描述jni的调用方式,需要对C或C++有一定了解。

    开发环境:eclipse, visual studio 2010

    举例说明:

    如有一个动态库mathOper.dll,里面有一个运算方法

     int Min(int a, int b);

    这个方法是用来判断最小值的。因为java是不能直接调用这个方法,所以需要有个中间库来衔接java和mathOper.dll

    第一步:定义这个中间库的名称为callMathOper,打开eclipse,新建一工程TestDll,定义类TestDll(名称任意),代码如下:

    public class TestDll {
    	static {
    		System.loadLibrary("callMathOper");// 载入dll
    	}
    
    	public native static int Min(int a, int b);// 函数声明
    
    }
    第二步:打开cmd窗口,进入TestDll.class目录下,执行javah TestDll,在当前目录生成TestDll.h

    第三步:打开visual studio,新建一项目callMathOper(这个就是中间库的名称),新建头文件TestDll.h,将第二步中生成的TestDll.h的内容copy到这个头文件里

    第四步:选中该项目,右键"属性",修改配置

    1.修改配置类型

    2.加入jdk下的include目录,主要作用是引入jni.h这个头文件


    第五步:在项目的源文件中新增一cpp文件callMathOper.cpp,加入如下代码:

    #pragma comment(lib,"mathOper.dll.lib")
    
    extern "C"_declspec(dllimport) int Min(int a,int b);
    
    #include <stdio.h>
    #include "TestDll.h"
    
    JNIEXPORT jint JNICALL Java_TestDll_Min(JNIEnv *, jclass _cls, jint a, jint b){
    	int result = Min(a,b);
    	return result;
    }
    第六步:右键“生成”,产生callMathOper.dll,将callMathOper.dll和mathOper.dll拷到java工程TestDll根目录下,在TestDll类中加入main方法,进行测试:

    public static void main(String[] args) {
        TestDll td = new TestDll();
        System.out.println(td.Min(123, 125));
    }
    看能否正常运行及输出结果是否正确。



    展开全文
  • Java调用C++动态链接的网络上的文章也很多,但是还是个别的问题没有提到,导致操作起来还是难度较大,关键是程序的疑难杂症不好治。 准备工具:vs2010,java1.6,MyElipse6.5,opencv2.4.6(其他版本请留意程序...
  • 1.创建一个类,在类中加入带native的方法(eclipse创建的类会自动添加class在bin目录下) 2.利用javah命令生成本地方法的c++头文件。进入到工程bin目录下,按住shift,并右击,选择 “在此处打开命令窗口”,...
  • JAVA调用动态链接DLL之JNative学习

    千次阅读 2014-05-25 22:51:00
    JAVA调用动态链接DLL的方法:JNI(Java Native Interface),JInvoke,JNative(Java to native interface),JNI是JAVA自身提供的方法;JInvoke从何而来不得而知,好像还需要注册付费的,64位的JDK、JIR环境下...
  • java连接C++动态库

    2012-08-06 22:41:10
    使用Java的JNI调用C/C++的动态联结库有个固定的步骤,下面将以一个最简单的HelloWorld例子程序来说明调用过程。这个HelloWorld的例子只是简单的显示HelloWorld消息。   第一步编写Java类 首先
  • JAVA 程序为 webapp,与控制台程序略不同,网上例子大多为控制台程序调用C++动态库.使我一开始走了很多弯路.控制台的例子网上很多这里就不写了. 先上CPP代码: 在VS2015里创建控制台空项目,之所以要空项目,是省...
  • java调用vs2013编写的dll动态库

    千次阅读 2016-04-17 22:46:33
    1、首先创建一个NativeDemo.java文件,文件内容如下代码: public class NativeDemo { int i; public static void main(String[] args) { NativeDemo ob=new NativeDemo(); ob.i=10; System.out.println(...
  • java调用C或C++动态链接原来如此简单
  • java动态库和静态库

    千次阅读 2014-12-14 09:13:54
    在我们的应用中,一些公共代码是需要反复使用,就把这些代码编译为“”文件;在链接步骤中,连接器将从文件取得所需的代码,复制到生成的可执行文件中。这种称为静态,其特点是可执行文件中包含了代码的...
  • 1、从http://www.oracle.com/technetwork/java/javase/downloads/jdk-7u2-download-1377129.html下载jdk-7u2-windows-i586.exe,安装到D:\ProgramFiles\Java,并将D:\ProgramFiles\Java\jdk1.7.0_02\bin添加到环境...
  • java调用xxx.dll 用JNative方法: ①:导入JNative.jar ②:下载JNativeCpp.dll(一般情况下把JNativeCpp.dll放 到 C:\Windows\System32文件夹下面。调试代码的话可 以放到当前项目下,和其他项目对接就必须...
  • 注:博主所用环境:eclipse , java10,visual studio 2017 一、编写Java程序 首先打开eclipse,新建java工程 在建好的工程中新建一个源文件:右键点击src——》new——》class 在对话框中输入包名、类名,并...
  • 在我们的应用中,一些公共代码是需要反复使用,就把这些代码编译为“”文件;在链接步骤中,连接器将从文件取得所需的代码,复制到生成的可执行文件中。这种称为静态,其特点是可执行文件中包含了代码的...
  • 花了两天时间,研究出来的,现在把整个过程记录分享...第一部分:简单的java调用C程序demo(在别人的基础上修改解释) 第一步.首先,我们先写个JAVA类: public class HelloJNI { static { System.loadLibrary("H...
  • C++ 通过jni生成JAVA调用(下)–C++生成并JAVA可以调用(windows)项目上 JAVA通过C++去调用硬件设备,需要用C++封装,然后JAVA调用C++的,这里描述JAVA调用C++的过程。 这里实现C++生成可让JAVA...
  • Java调用C、C++代码 JNI的使用 - 开发环境 - Win7 64位 - Eclipse 64位+JDK1.8 - VS2013 64位 新建Java项目,使用native定义要实现的方法 使用DOS窗口生成class文件 使用DOS窗口生成.h文件 新建VS2013...
  • java调用dll使用过程详解 java安装 1、从官网下载JDK:jdk-8u281-windows-x64.exe,需要先注册用户 2、双击安装到D:\JAVA目录,安装后设置系统环境变量path包括D:\Java\jdk1.8.0_281\bin,classpath包括D:\Java\jdk...
  • Java 调用dll

    千次阅读 2012-11-18 15:36:21
    Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。...使用Java调用DLL动态链接的方案通常三种:JNI, Jawin, Jacob. 其中JNI(Java Native Interfa
  • 我们要使用某服务的SDK,但是对方只有纯c++风格的第三方的arm架构的动态库(.so),因此无法直接在java app中直接使用,需要将原始so库封装成符合JNI命名规范的so库(以下简称JNI so库),然后才能通过JNI在java app中...
  • linux jna调用so动态库

    千次阅读 2012-12-11 16:20:59
    文中提到:为什么命名为libtest.so而不是test.so呢?因为jna在找so文件的时候,要匹配前缀为lib的so文件 ...在linux下使用jna调用本地方法的时候,需要将C写成的程序编译为so文件 1、写一个简单test.c文件:
  • 1.启动VS2015 2.新建一个Win32项目 3.下一步,选择dll 4.切记两点!!! ...(1)....(2)....不然会提示Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up functi...
  • 一、简单说明 java调用动态库其实都是需要通过一些辅助的组件,java调用vc的动态库一般是用JNI,而java调用vb的动态库更确切的说是调用vb的Com组件则是用的jacob了。本人也是班门弄斧,想鄙视我的就鄙视吧,呵呵二...
  • 在linux下使用jna调用本地方法的时候,需要将C写成的程序编译为so文件 1、写一个简单test.c文件: #include<stdio.h> int add(int a,int b); int add(int a,int b) { int c = a + b ; return c ; } 2、...
  • JNI,是Java Native Interface的简称,中文是“Java本地调用JAVA以其跨平台的特性深受...JAVA通过JNI调用本地方法,而本地方法是以文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。
  • 开发工具:java [Eclipse] C++[VS2012] 参考网上资料: https://www.cnblogs.com/cuglkb/p/5665882.html (如不妥,请告知) 代码demo部分:    创建一个名为JavaCJniTest的java项目,并创建一个test包; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,891
精华内容 20,356
关键字:

java调用有窗口的动态库

java 订阅