JNI系列最终篇-springbootJNI/springbootJNA项目搭建【三】

本文详细介绍了如何在Springboot项目中整合JNI和JNA技术,涉及SO文件统一加载、模块化文件管理、项目打包和运行,以及C库的C++代码和Java交互的实战过程。通过实际项目源码分享,展示了如何配置自动加载JNI SO和JNA,以及启动命令和日志跟踪。
摘要由CSDN通过智能技术生成

一、背景

之前都是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框架之入门(一)

这些都是 Android NDK 内部的 `Android.mk` 文件。其中,`./android-ndk-r25c/sources/android/native_app_glue/Android.mk` 是用于编译 Native Activity 示例应用程序的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/support/Android.mk` 是包含一些 Android 支持库的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/ndk_helper/Android.mk` 是包含一些辅助函数和类的 `Android.mk` 文件;`./android-ndk-r25c/sources/android/cpufeatures/Android.mk` 是用于编译 `cpufeatures` 库的 `Android.mk` 文件,该库提供了一些 CPU 相关的信息和功能;`./android-ndk-r25c/sources/cxx-stl/llvm-libc++abi/Android.mk` 和 `./android-ndk-r25c/sources/cxx-stl/llvm-libc++/Android.mk` 是用于编译 C++ STL 库的 `Android.mk` 文件,分别对应 libc++abi 和 libc++ 两个 STL 库;`./android-ndk-r25c/sources/third_party/googletest/Android.mk` 是用于编译 Google Test 测试框架的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/Android.mk` 是用于编译 Shaderc 编译器的 `Android.mk` 文件,该编译器可以将 GLSL 代码编译成 SPIR-V 代码;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc/Android.mk` 是用于编译 Shaderc 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/libshaderc_util/Android.mk` 是用于编译 Shaderc Util 库的 `Android.mk` 文件,该库提供了一些辅助函数和类;`./android-ndk-r25c/sources/third_party/shaderc/third_party/Android.mk` 是用于编译 Shaderc 编译器依赖的第方库的 `Android.mk` 文件,包括 glslang 和 spirv-tools 两个库;`./android-ndk-r25c/sources/third_party/shaderc/third_party/glslang/Android.mk` 是用于编译 glslang 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/shaderc/third_party/spirv-tools/Android.mk` 是用于编译 spirv-tools 库的 `Android.mk` 文件;`./android-ndk-r25c/sources/third_party/vulkan/src/build-android/jni/Android.mk` 是用于编译 Vulkan 库的 `Android.mk` 文件。 如果您要在 Android NDK 中编写自己的 `Android.mk` 文件,可以参考这些示例文件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cy谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值