zoukankan      html  css  js  c++  java
  • 在Visual C++中编译JNI DLL

    在Java中调用C语言的DLL的一个方式就是JNI( Java Native Interface)。但是,在VC++ 6.0中编译JNI DLL遇到一个小问题。例如: Java定义如下:
    public class NTPortJava
    {
        
    // Returns a value indicates whether the application is running under Windows NT/2000 system.
        public native static boolean IsWinNT();
    }
    使用Javah可以生成如下的函数定义:
    /*
     * Class:     NTPortJava_NTPortJava
     * Method:    IsWinNT
     * Signature: ()Z
     
    */

    JNIEXPORT jboolean JNICALL Java_NTPortJava_NTPortJava_IsWinNT
      (JNIEnv 
    *, jclass);
    如果编写好Java_NTPortJava_NTPortJava_IsWinNT进行编译链接也可以正常生成DLL,但是使用Dependency Walker可以发现DLL中导出的函数不是Java_NTPortJava_NTPortJava_IsWinNT,而是_Java_NTPortJava_NTPortJava_IsWinNT@0。出现这个问题的原因是JNIEXPORT在jnimd.h 的定义:
    #define JNIEXPORT __declspec(dllexport)
    Visual C++对于__declspec(dllexport)的处理就是在导出函数的前后添加修饰符号。解决问题的办法很简单,只需要建立一个.def文件就可以了:
    LIBRARY NTPortJava

    EXPORTS 
    Java_NTPortJava_NTPortJava_IsWinNT
    这样编译链接后产生的DLL就满足要求了。
  • 相关阅读:
    EL表达式_1
    Servlet2
    Servlet1
    安装Tomcat
    Java日期时间3
    SpringCloud之Ribbon负载均衡
    SpringCloud之Eureka注册中心
    存储过程—增减字段
    880. Decoded String at Index
    977. Squares of a Sorted Array
  • 原文地址:https://www.cnblogs.com/zealsoft/p/221329.html
Copyright © 2011-2022 走看看