• JNI调用实例


    1. 环境

    Windows7-64Bit

    VS2010-32Bit

    JDK1.8-64Bit

    2. 步骤

    2.1 创建NativePrint类

    public class NativePrint {
        public native void nativePrint();
    }

    其中包含一个native方法,这个native方法是通过C++实现的,C++的实现代码最终是生成dll文件,然后通过Java调用。

    2.2 编译NativePrint类以及生成头文件

    使用命令javac NativePrint.java编译,然后在通过javah NativePrint命令生成头文件,具体如下:

    命令:

    生成的文件:

    其中NativePrint.h的文件内容为:文件内容不可以修改

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

     2.3 C++实现NativePrint.nativePrint()方法

    (1)安装VS2010版本,然后创建一个32位dll的空项目,具体步骤:文件 -> 新建项目 - > Win32 - > Win32控制台命令程序,然后下一步,做如下设置:

    (2)拷贝

    D:Program FilesJavajdk1.8.0_111includewin32jawt_md.h

    D:Program FilesJavajdk1.8.0_111includewin32jni_md.h

    D:Program FilesJavajdk1.8.0_111includejni.h

    NativePrint.h

    四个文件拷贝到D:Program Files (x86)Microsoft Visual Studio 10.0VCinclude,备注:具体目录请参考自己本地的jdk和VS2010的安装目录;

    (3)在native_print工程的源文件目录下,创建NativePrint.cpp文件,内容如下:

    #include <jni.h>  
    #include <stdlib.h>  
    #include <NativePrint.h>  
    #ifdef __cplusplus  
    extern "C" {  
    #endif  
    /*这个方法名称一定要和头文件的一模一样,不过头文件中的参数只有类型,没有名称,需要加成如下参数*/  
    JNIEXPORT void JNICALL Java_NativePrint_nativePrint(JNIEnv *jenv, jobject jobj) {  
      /*就打印这一条语句*/  
      printf("=====888");  
    }  
    #ifdef __cplusplus  
    }  
    #endif 
    

    2.4 编译64位的dll文件

    2.4.1 配置64的编译环境

    因为整个环境都是在64位进行,而VS2010的默认创建的工程都是32位的,需要修改。备注:如果不使用64位的dll则会报错 java.lang.UnsatisfiedLinkError: D:Program FilesJavajdk1.8.0_111in ative_print.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

    (1)点击工具栏上面的配置管理器,如图

    (2)找到“活动解决方案平台(P)”点击新建

    (3)选择x64,然后保存即可。

    2.4.2 编译

    然后按F7,就可以在工程目录下面生成一个与工程同名的dll文件,如下:注意是在x64目录下面

    备注:如果在运行过程中遇到如下错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏, 请参考http://blog.csdn.net/kevin_mqj/article/details/22981873 

    2.5 运行

    将生成的dll文件拷贝到java.library.path目录下面,比如D:Program FilesJavajdk1.8.0_111in

    创建一个测试java测试类,如Test.java

    public class Test {
        static {
            System.loadLibrary("native_print");
        }
    
        public static void main(String[] args) {
            new NativePrint().nativePrint();
        }
    
    }  

    然后运行Test.java

    结果截图:

    参考资料

    http://blog.csdn.net/oscar999/article/details/7895367

    http://blog.csdn.net/seanwang_25/article/details/17285505

    http://blog.csdn.net/l527719041/article/details/77434652

    http://blog.csdn.net/fenglibing/article/details/4300381

    http://blog.csdn.net/kevin_mqj/article/details/22981873

    https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform

  • 相关阅读:
    Slimer软工课设日报-2016年6月30日
    Slimer软工课设日报-2016年6月29日
    软件工程个人总结
    什么是Bug
    构建之法读后感----第1章 绪论
    7.4
    7.1-7.3
    6.29
    软件工程课设 第二天
    软工总结 作业
  • 原文地址:https://www.cnblogs.com/lujiango/p/8119617.html
Copyright © 2020-2023  润新知