JNI专题
文章平均质量分 77
最近在做JNI相关工作,首次接触,希望用一个专题完整记录遇到的所有坑,同时记录从零到整的过程
cy谭
求索计算惆怅断肠
展开
-
JNI入门与进阶,JNI调用外部非标准程序SO【一】
本文是JNI专题的开头文章,主要介绍JNI项目如何从零到整的过程 一、JNI简介Java Native Interface,即Java本地接口。它允许在Java虚拟机内运行的java代码与其他编程语言(如c, c++和汇编语言)编写的程序和库进行交互。简单点说, JNI可以帮助我们用java代码访问其他编程语言 二、JNI项目需求:开发 JAVA WEB服务调用已有的so动态链接库,完成相关的业务功能开发。因此需要借助JNI技术来完成。标准JNI的结构如下java代码结束JNI调用由C代.原创 2021-11-01 01:21:50 · 2421 阅读 · 0 评论 -
JNI对象传参与返回对象结果-C结构体参数【二】
一、背景上一篇谈到如何创建JNI项目以及提供调用外部SO的思路,通过简单的例子实现调用C程序。本篇继续在之前的话题做深入的探讨,主题就是对象传参。对应C语言就是结构体参数。二、需求做个一个简单的需求,然后实现并验证。希望对象传参,同时能返回对象参数。比如现在JAVA端有参数对象 Param 和结果接收对象参数ReturnParampublic class Param { private int a; private int b; //描述 private原创 2021-11-06 15:50:33 · 1723 阅读 · 0 评论 -
JNI系列最终篇-springbootJNI/springbootJNA项目搭建【三】
一、背景之前都是JNI/JNA各个技术碎片讲解。本篇将之前的整合起来,并搭建项目springboot来实现。springboot跟之前的不同点主要集中在:①如何统一加载SO文件②如何拆件文件,使之按照项目的结构分布③项目打包,运行二、项目源码【点击跳转下载】编程环境:Windows10+ideaIU-2020.1.2项目管理:mavenJDK版本:JDK8项目说明:基于springboot的JNI和JNA实现,包括C语言程序,调用java程序。主要目标是搭建web的项目来调用C程序原创 2021-11-07 02:18:14 · 2777 阅读 · 3 评论 -
JNI便捷开发框架JNA框架之入门(一)
JNA介绍JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。它提供一组Java工具类用于在运行期动态访问系统本地共享类库而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。JNA调用过程JNA调用C/C++的过程大致如下:也就是说,不需要写任何C/C++的代码,我们就能调原创 2021-10-30 16:45:37 · 6454 阅读 · 2 评论 -
JNI便捷开发框架JNA框架之指针参数Pointer(二)
背景本项目是基于JNA框架开发,本文的焦点是如何进行地址传递在java中都是值传递,但是因为使用JNA框架,目标函数是C/C++是有地址变量的,很多时候都需要将变量的结果带回,因此,地址传递在JNA项目中几乎是必须的。案例代码C/C++/** * 返回a+b的值 * 同时c和msg通过参数返回 */int add(int a, int b, int *c, char **msg) { *c = (a + b) * 2; char *string = "hello world原创 2021-10-30 23:50:56 · 13729 阅读 · 3 评论 -
JNI便捷开发框架JNA框架之引用传递ByReference(三)
背景上一篇介绍了JNA框架开发的指针参数传递需要借助类Pointer,也给出例子如何使用Pointer。本编继续就这个话题,引入另一个类ByReference来实现参数的地址传递(指针传递)案例代码还是上一篇的案例 JNI便捷开发框架JNA框架之指针参数Pointer(二)ByReference类com.sun.jna.ptr.ByReference提供通用的“指向类型的指针”功能,通常在C代码中用于向调用方返回值以及函数结果。ByReference提供了很多继承类,类似Point原创 2021-10-31 01:24:38 · 7080 阅读 · 4 评论 -
JNI便捷开发框架JNA框架之结构参数体传递(四)
一、背景上一篇介绍了JNA框架开发的指针参数传递另一种方法ByReference。有了ByReference基本数据类型参数的传值,传地址的难题已经基本解决。但是在实际生产过程中,还有一种数据类型也经常用到,在java中,我们叫对象,在C中对应的就是结构体。事实上,在面向对象开发的过程中,很多时候不会单一的使用基本数据类型传参,经常都是用对象定义的变量当作参数传递。即使在面向过程的C语言中,面对复杂的业务场景,用结构体传参也是常有的是。现在的专题研究的是JNA,java和C交互。那么这个知识点就必须整原创 2021-11-01 22:09:54 · 4543 阅读 · 17 评论 -
JNI-[坑1] java调用c程序生成动态链接库错误整理
原文:springboot环境下java调用c程序生成动态链接库(基于JNI,linux环境下运行)本文解决实践过程中的错误1、java执行报错Error: Could not find or load main class helloJNI.class解决:java程序 HelloJNI 不能有package2、设置LD_LIBRARY_PATH 报错-bash: export: ’ ': not a valid identifier解决:设置命令 export LD_LIBRARY_PAT原创 2021-10-26 14:36:07 · 899 阅读 · 0 评论 -
JNI-[坑2] 加载C++动态链接库错误解决
java调用C++动态链接库报错Servlet.service() for servlet [dispatcherServlet] in context with path [/my] threw exception [Handler dispatch failed; nested exception is java.lang.UnsatisfiedLinkError: xxx with root cause直接原因: 加载so文件失败,即 System.load 和 System.loadLib原创 2021-10-29 09:56:44 · 1015 阅读 · 0 评论 -
JNI-[坑3]JNA结构体传参ByValue does not provide enough names
JNA调用结构体传参报错StudentStruct$ByValue does not provide enough names [0] ([]) to match declared fields [2]原创 2021-11-01 20:43:14 · 2930 阅读 · 3 评论