JNI调用

作者: xiangyue | 来源:发表于2018-04-10 17:16 被阅读13次

    环境准备

    最近因为项目原因需要使用到JNI,但是找了下网上,大家的都层次不齐,有的是32位的操作系统,也不太符合我的需求,所以,在此写下留个纪念,文章虽短,还是走了很多的坑路,然后总结出来的,希望大家多多支持啦.

    文中涉及到类加载器的使用,感兴趣的可以百度或者Google一下,本文就不进行详细叙述了.

    注意:本文所有的使用的都是64位

    gcc安装

    1.下载并进行安装
    https://sourceforge.net/projects/mingw-w64/
    
    2.进入并进行选择安装,可以参考下面这篇文章进行安装
    https://jingyan.baidu.com/article/19192ad816ea01e53e570730.html
    
    3.配置环境变量
    在path里面加入如下参数即可,我的安装目录是在 E:\mingw64\
    E:\mingw64\mingw64\bin;
    
    4.查看是否安装成功
    gcc -v
    

    jdk安装

    对于开发java的人来说,应该都是有的吧,只是我的jdk版本是1.8 64位的

    image.png

    开发工具

    IDEA

    项目创建

    1.创建项目名JNI

    2.层次结构


    image.png

    3.编写HelloWorld

        package com.wanggan.jni;
    
        /**
        * @author wanggan
        */
        public class HelloWorld {
            public native void displayHelloWorld();
            
            static {
                System.loadLibrary("hello");
            }
            
            public static void main(String[] args) {
            
                new HelloWorld().displayHelloWorld();
            }
        }
    

    创建c文件并进行编译

    1.使用javah创建头文件
    在src目录下使用如下命令javah com.wanggan.jni.HelloWorld,此时,在src文件夹下面会生成一个com_wanggan_jni_HelloWorld.h的文件

    2.创建.c文件

    将上面的`.h`文件可以拷贝出来,然后创建一个文件夹并放在下面(例如文件夹叫demo),并创建一个文件叫`com_wanggan_jni_HelloWorldImpl.c`,结构为:
    
    image.png
    `com_wanggan_jni_HelloWorldImpl.c`内容为:
    
    #include "jni.h"
    #include "com_wanggan_jni_HelloWorld.h"
    
     
    JNIEXPORT void JNICALL
    Java_com_wanggan_jni_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj){
    
        printf("this is c print content,it's magic\n");
        return;
    }
    
    可以看出,文件中调用了`jni.h`,并使用了创建出来的的`.h`文件
    

    3.进行编译

    `gcc -I %java_home%\include -I %java_home%\include\win32 com_wanggan_jni_HelloWorldImpl.c -shared -o hello.dll`
    
    说明: 
    1.`-I` 是指定加载这下面的预处理文件,因为需要使用到`jni.h`和`jni_md.h`,分别可以在这两个下面找到,
    2.`hello.dll`即是java中`System.loadLibrary("hello");`调用的库文件名称,
    3.此时文件夹下面生成了一个叫`hello.dll`文件
    

    4.将编译好的.dll文件放到项目根目录下即可

    5.在控制台或编辑器进行执行

    编辑器:

    在编辑器中执行一般都不会报错,如果报错,可以设置下vm参数,`-Djava.library.path=你的项目根路径`
    

    控制台:

    1.控制台在src文件夹下面执行命令`javac com\wanggan\jni\HelloWorld.java`,
    2.再进行执行`java com.wanggan.jni.HelloWorld`
    3.控制台会报错,因为加载器默认加载的是`java.library.path`,因为dll文件不在那个环境变量目录下,此时我们可以指定`java.library.path`,
    4.我们可以在根目录下面创建一个dll文件夹,将生成的dll文件放到这个文件夹下面,然后再执行
    `java -Djava.library.path="E:\IDEA PROJECT\JNI\dll" com.wanggan.jni.HelloWorld`
    

    6.执行结果截图


    image.png

    疑问解答

    因为不是经常看,所以请在下边进行留言,看到后会尽快回复,谢谢,如果文中有什么不对的地方,麻烦大家帮忙提出,我回尽快优化并进行整理.

    最后,非常感谢各位的支持.

    相关文章

      网友评论

      • IT人故事会:贵在坚持,么么哒!我也是个爱写文章的人

      本文标题:JNI调用

      本文链接:https://www.haomeiwen.com/subject/jzdnhftx.html