zoukankan      html  css  js  c++  java
  • Java调用C++动态库具体实现

    原文链接:https://blog.csdn.net/hanyueyingxin/article/details/78203174

    在我们编写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:workspacejnitestin。键入javah -classpath D:workspacejnitestin 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 FilesMicrosoft Visual StudioMyProjectsHelloWorld目录下面。

    将Java JDK下include目录下的jni.h和includewin32jni_md.h两个头文件拷贝到VC安装目录下的例如:D:Program FilesMicrosoft Visual StudioVCInclude目录下面。在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!
    ");
    
    return;
    
    }

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

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

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

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

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

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

  • 相关阅读:
    Surface Mount Package Details
    Boost Converter
    IPC low/medium/high density 什么意思?
    SMT Surface Mount Technology footprint references
    Time Step Too Small in Multisim
    mOByDiC E90C2600 EOBD/OBDII to RS232 gateway
    STN1110 Multiprotocol OBD to UART Interpreter
    STN1170 Multiprotocol OBD to UART Interpreter
    BR16F84 OBD II Interface Chip For PWM, VPW, and ISO 9141-2 Vehicles
    ELM327 OBD to RS232 Interpreters
  • 原文地址:https://www.cnblogs.com/symcheal/p/14640397.html
Copyright © 2011-2022 走看看