JNI调用

环境准备

最近因为项目原因需要使用到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

疑问解答

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。