一、背景
之前都是JNI/JNA各个技术碎片讲解。本篇将之前的整合起来,并搭建项目springboot来实现。
springboot跟之前的不同点主要集中在:
①如何统一加载SO文件
②如何拆件文件,使之按照项目的结构分布
③项目打包,运行
二、项目源码
【点击跳转下载】 或者 https://gitee.com/zhan107876/jni-jna-web[加入动态库dll]
编程环境:Windows10+ideaIU-2020.1.2
项目管理:maven
JDK版本:JDK8
项目说明:基于springboot的JNI和JNA实现,包括C语言程序,调用java程序。主要目标是搭建web的项目来调用C程序
三、项目文件结构
说明:
①打包后C文件会复制到native文件夹
②打包后的目录结构
③startup.sh是启动命令,里面加上了生成so文件的命令
# 生成so文件
gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -shared -o native/libHelloJNI.so native/HelloJNI.c;
gcc -fPIC -I $JAVA_HOME/include -I $JAVA_HOME/include/linux -shared -o native/libhello.so native/hello.c;
四、配置说明
1、JNI的so在服务启动的时候自动加载,加载类是ApplicationRunnerImpl
2、JNA的so加载放到每个具体service中,比如CallJnaService,通过静态加载方式完成,因为加载完需要放到具体的接口中,供代码调用,比如CallJnaService.LIBRARY_STRUCT
3、logback-boot.xml是日志配置
4、assembly.xml打包配置
五、服务运行
部署环境linux centos7
启动之后会在native文件夹生成C对应的so文件
启动日志如下,表示正常
好了之后调用测试接口(具体ip根据自己部署的来)
http://192.168.0.101:8070/jnic/java-c/callJniMethod
http://192.168.0.101:8070/jnic/java-c/callJnaMethod
运行结果:
结果正确。更多细节请看源码。
–
–
–
关于JNI和JNA的更多技术细节请从开篇看起
. 上一篇.:JNI对象传参与返回对象结果-C结构体参数【二】
.JNI开篇:JNI入门与进阶,JNI调用外部非标准程序SO【一】
JNA开篇:JNI便捷开发框架JNA框架之入门(一)