当前位置: 首页 > news >正文

JAVA JNA 调用C接口的三种方式

文章目录

  • 1. 准备一个共享库文件
  • 2. JNA姿势1—继承Library接口
  • 3. JNA姿势2—直接NativeLibrary.getInstance
  • 3. JNA姿势3—Native方法

1. 准备一个共享库文件

test.c

#include <stdio.h>
int test(char *input){printf("input:%s\n",input);return 0;
}

libtest.so

[root@node-126 ~]# gcc -fPIC -shared -o libtest.so test.c 
[root@node-126 ~]# ls /root/
anaconda-ks.cfg  libtest.so  node-v6.10.2-linux-x64.tar.xz  original-ks.cfg  spring3  test  test.c

可以看到有test方法

[root@node-126 ~]# nm -D libtest.so 
0000000000201038 B __bss_startw __cxa_finalize
0000000000201038 D _edata
0000000000201040 B _end
0000000000000600 T _finiw __gmon_start__
00000000000004c0 T _initw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTableU printf
00000000000005d5 T test

2. JNA姿势1—继承Library接口

建个普通maven项目

       <dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>5.5.0</version></dependency>
package jna;import com.sun.jna.Library;
import com.sun.jna.Native;/*** 接口继承** @author majun* @version 1.0* @since 2023-08-22 22:27*/
public interface MyClibrary extends Library {MyClibrary INSTANTCE = Native.load("/root/libtest.so", MyClibrary.class);int test(String input);
}

测试

import jna.MyClibrary;/*** TODO** @author majun* @version 1.0* @since 2023-03-31 7:44*/
public class Main {public static void main(String[] args) {int test = MyClibrary.INSTANTCE.test("extend Library");System.out.println(test);}
}

使用Linux上的Java运行
在这里插入图片描述

3. JNA姿势2—直接NativeLibrary.getInstance

import com.sun.jna.Function;
import com.sun.jna.NativeLibrary;/*** TODO** @author majun* @version 1.0* @since 2023-03-31 7:44*/
public class Main {public static void main(String[] args) {NativeLibrary instance = NativeLibrary.getInstance("/root/libtest.so");Function func = instance.getFunction("test");Object res = func.invoke(Integer.class, new Object[]{"NativeLibrary.getInstance"});System.out.println( res);}
}

3. JNA姿势3—Native方法

mkdir -p /root/jna && cd /root/jna 新建MyNative.java


package jna;
import java.io.IOException;public class MyNative {native int  test(String input) throws IOException;
}

编译并生成头文件(这里java17没找到javah命令,改用java8的,但注意javac ,javah要使用同一个Java版本的)

 /usr/local/jdk1.8.0_111/bin/javac  MyNative.java/usr/local/jdk1.8.0_111/bin/javah -classpath /root/ -jni   jna.MyNative

linux直接编辑实现头文件中的接口:

#include <stdio.h>
#include <jni.h>
#include "jna_MyNative.h"
jint  Java_jna_MyNative_test(JNIEnv *jniEnv, jobject clazz, jstring input){printf("input:%s\n",(char *)input);return 0;
}

编译时注意引入jdk头文件包下的jni.h等

gcc -fPIC -shared -I/usr/lib/jvm/jdk-17-oracle-x64/include -I/usr/lib/jvm/jdk-17-oracle-x64/include/linux -o libtest.so test.c

使用Clion实现头文件的接口:新建C项目,引入jna_MyNative.h,并实现其中的方法

在这里插入图片描述

注意
1.使用远程toolchain,cmake编译安装运行,注意cmake版本可能导致include_directories(SYSTEM "/usr/lib/jvm/jdk-17-oracle-x64/include") 同步Linux上jdk的头文件失败,本地无法找到符号,但可以正常运行。
2.jniEnv必须Java调用才会有值。

cmake_minimum_required(VERSION 2.8)
project(untitled1)set(CMAKE_CXX_STANDARD 17)
include_directories(SYSTEM "/usr/lib/jvm/jdk-17-oracle-x64/include")
include_directories(SYSTEM "/usr/lib/jvm/jdk-17-oracle-x64/include/linux")add_executable(testexe main.cpp)
add_library(test SHARED main.cpp jna_MyNative.h)
target_link_libraries(test -I/usr/lib/jvm/jdk-17-oracle-x64/include -I/usr/lib/jvm/jdk-17-oracle-x64/linux)
install(TARGETS test LIBRARY DESTINATION /usr/lib)

Java调用测试

import jna.MyNative;import java.io.IOException;/*** TODO** @author majun* @version 1.0* @since 2023-08-23 23:44*/
public class Main {public static void main(String[] args) throws IOException {System.load("/root/jna/libtest.so");//System.loadLibrary("test");// 自动拼接成libtest.so,默认从/usr/lib,/usr/lib64等路径找MyNative myNative = new MyNative();int test = myNative.test("native");System.out.println(test);}
}

姿势3实现的C接口,Java依旧可以使用姿势1,2的方式来调用,注意函数名为Java_jna_MyNative_test

[root@node-126 lib]# nm -D /usr/lib/libtest.so 
0000000000201070 B __bss_startU __cxa_allocate_exceptionw __cxa_finalizeU __cxa_free_exceptionU __cxa_throw
0000000000201070 D _edata
0000000000201078 B _end
0000000000000b4c T _finiw __gmon_start__U __gxx_personality_v0
0000000000000860 T _initw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable
0000000000000a15 T Java_jna_MyNative_testw _Jv_RegisterClasses
0000000000000ac8 T mainU printfU _Unwind_Resume
0000000000000b18 W _ZN7JNIEnv_8ThrowNewEP7_jclassPKc
0000000000000aea W _ZN7JNIEnv_9FindClassEPKcU _ZTIi

相关文章:

JAVA JNA 调用C接口的三种方式

文章目录 1. 准备一个共享库文件2. JNA姿势1—继承Library接口3. JNA姿势2—直接NativeLibrary.getInstance3. JNA姿势3—Native方法 1. 准备一个共享库文件 test.c #include <stdio.h> int test(char *input){printf("input:%s\n",input);return 0; }libtes…...

StarRocks入门到熟悉

1、部署 1.1、注意事项 需要根据业务需求设计严谨的集群架构&#xff0c;一般来说&#xff0c;需要注意以下几项&#xff1a; 1.1.1、FE数量及高可用 FE的Follower要求为奇数个&#xff0c;且并不建议部署太多&#xff0c;通常我们推荐部署1个或3个Follower。在三个Followe…...

华为AR路由器 典型配置案例——以太网交换

目录 Eth-Trunk 例&#xff1a;配置三层链路聚合 组网需求 操作步骤 检查配置结果 配置脚本 VLAN 举例&#xff1a;配置基于接口划分VLAN&#xff0c;实现同一VLAN内的互通&#xff08;同设备&#xff09; 组网需求 操作步骤 检查配置结果 配置脚本 举例&#xff…...

DP读书:鲲鹏处理器 架构与编程(十三)操作系统内核与云基础软件

操作系统内核与云基础软件 鲲鹏软件构成硬件特定软件 鲲鹏软件构成硬件特定软件1. Boot Loader2. SBSA 与 SBBR3. UEFI4. ACPI 操作系统内核Linux系统调用Linux进程调度Linux内存管理Linux虚拟文件系统Linux网络子系统Linux进程间通信Linux可加载内核模块Linux设备驱动程序Linu…...

Vue2项目练手——通用后台管理项目第一节

Vue2项目练手——通用后台管理项目 知识补充yarn和npm区别npm的缺点&#xff1a;yarn的优点 npm查看镜像和设置镜像 项目介绍项目的技术栈 项目搭建文件目录 创建路由&#xff0c;引入element-uirouter/index.jsmain.jspages/Users.vuepages/Main.vuepages/Home.vuepages/Login…...

「Vue|网页开发|前端开发」02 从单页面到多页面网站:使用路由实现网站多个页面的展示和跳转

本文主要介绍如何使用路由控制来实现将一个单页面网站扩展成多页面网站&#xff0c;包括页面扩展的逻辑&#xff0c;vue的官方路由vue-router的基本用法以及扩展用法 文章目录 本系列前文传送门一、场景说明二、基本的页面扩展页面扩展是在扩什么创建新页面的代码&#xff0c;…...

【Nginx20】Nginx学习:FastCGI模块(二)缓存配置

Nginx学习&#xff1a;FastCGI模块&#xff08;二&#xff09;缓存配置 通过上篇文章的学习&#xff0c;普通的 PHP 与 Nginx 的连接就已经没啥大问题了。一般的网站直接那套配置就够了&#xff0c;这也是 Nginx 非常友好的一面。很多在默认的配置文件中注释掉的内容&#xff0…...

苹果支付外包开发流程

苹果支付的实现流程主要涉及集成苹果的支付系统——Apple Pay&#xff0c;以及在你的应用中处理支付交易。以下是一个简要的实现流程概述&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.开发者账号…...

银河麒麟V10(Tercel)服务器版安装 Docker

一、服务器环境 ## 查看系统版本&#xff0c;确认版本 cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Tercel)## 操作系统 uname -p aarch64## 内核版本&#xff08;≥ 3.10&#xff09; uname -r 4.19.90-21.2.ky10.aarch64## iptables 版本&#xff08;…...

web、HTTP协议

目录 一、Web基础 1.1 HTML概述 1.1.1 HTML的文件结构 1.2 HTML中的部分基本标签 1.3 URI 和 URL 二.HTTP协议 2.1.HTTP概念 2.2.HTTP协议版本 2.3.HTTP请求方法 2.4.HTTP请求访问的完整过程 2.5.HTTP状态码 2.6.HTTP请求报文和响应报文 2.7.HTTP连接优化 三.HTT…...

达梦SQL书写注意事项

模糊查询 模糊查询like后面的字段要求用单引号引用&#xff0c;不能使用双引号 select * from user where name like %小组 分组查询 select查询的列字段必须在分组中的字段存在 正确&#xff1a; select name,age from user group by name,age 错误&#xff1a; select * f…...

博途1200脉冲输出控制速度轴(轴工艺对象基本配置)

这里的1200脉冲轴,主要用来完成线缆包材绕包时的重叠率控制。关于重叠率的具体概念,这里不再阐述,大家可以看下面的文章链接, 重叠率控制 重叠率控制(算法详细介绍含SCL和梯形图源代码)_RXXW_Dor的博客-CSDN博客产品包装和线缆保护材料的包覆都需要进行材料包装重叠率的控…...

微信小程序 通过setData 给两个变量设置同一个数组时,为什么修改一个变量,另一个会也被修改?

在微信小程序中&#xff0c;使用 setData 方法更新数据时&#xff0c;如果给两个变量设置同一个数组&#xff0c;修改其中一个变量的值会导致另一个变量也被修改的原因是&#xff0c;数组是引用类型的数据&#xff0c;在内存中的存储方式是按引用地址存储。 当你将一个数组赋值…...

保障Web安全:构建可靠的网络防御体系

在当今数字化时代&#xff0c;Web安全已成为互联网世界中至关重要的议题。随着网络攻击手段的不断演进和网络犯罪的增加&#xff0c;保护用户数据和确保系统安全性已成为任何Web应用程序的首要任务。本文将深入探讨Web安全的重要性以及构建可靠的网络防御体系的关键要素。我们将…...

LeetCode--HOT100题(44)

目录 题目描述&#xff1a;230. 二叉搜索树中第K小的元素&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;230. 二叉搜索树中第K小的元素&#xff08;中等&#xff09; 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你…...

大模型调试debug记录

环境&#xff1a;Linux , cuda 11.7 RuntimeError: Distributed package doesnt have NCCL built in 原因&#xff1a;pytorch安装的是cpu版本&#xff0c;需要安装支持gpu版本的 RuntimeError: Distributed package doesnt have NCCL built in - #3 by bdabykov - distrib…...

对话谷歌首席技术官肖恩,搜索引擎的里程碑,来看看搜索引擎界的大哥Algolia的“快、准、狠”突围关键

原创 | 文 BFT机器人 人物背景 Character Background Sean Mullaney是Algolia&#xff08;端到端人工智能搜索和发现平台&#xff09;的首席技术官&#xff0c;也是前 Stripe和谷歌高管&#xff0c;拥有扩展工程组织、开发人工智能驱动的搜索和发现工具以及在全球范围内发展A…...

DP读书:鲲鹏处理器 架构与编程(十二)鲲鹏软件实战案例

10min速通了解鲲鹏软件实战案例 云服务器源码移植与编译配置云服务器Porting Advisor代码移植搭建交叉编译环境x86云服务器交叉编译 OpenSSL鲲鹏云服务器上编译 OpenSSL Docker的安装与应用安装DockerDocker运行与验证Docker常用命令卸载Docker安装适配鲲鹏架构的Docker镜像 KV…...

前端 -- 基础 VSCode 工具生成骨架标签新增代码 解释详解

目录 文档类型声明标签 Lang 语言种类 字符集 文档类型声明标签 <!DOCTYPE> 文档类型声明&#xff0c;作用就是告诉浏览器 当前的页面是 使用哪种 HTML 版本 来显示的网页 HTML 版本也很多呀 &#xff0c;比如 &#xff1a; HTML5 ,HTML4&#xff0c;XHTML 等…...

爬虫逆向实战(二十三)--某准网数据

一、数据接口分析 主页地址&#xff1a;某准网 1、抓包 通过抓包可以发现数据接口是api_to/search/company_v2.json 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现b参数和kiv参数是加密参数 请求头是否加密&#xff1f; 无响应是否加…...

Chord - Ink Shadow 跨模态应用探索:连接文本与MATLAB科学计算

Chord - Ink & Shadow 跨模态应用探索&#xff1a;连接文本与MATLAB科学计算 你有没有过这样的经历&#xff1f;面对一堆实验数据&#xff0c;脑子里已经想好了要画个什么样的图来分析&#xff0c;但打开MATLAB&#xff0c;却卡在了写代码这一步。复杂的函数名、繁琐的语法…...

FLUX.1-dev-fp8-dit文生图+SDXL_Prompt风格效果展示:多分辨率适配(1024x1024/768x1344)

FLUX.1-dev-fp8-dit文生图SDXL_Prompt风格效果展示&#xff1a;多分辨率适配&#xff08;1024x1024/768x1344&#xff09; 你见过能同时驾驭方形海报和竖屏手机壁纸的AI画图工具吗&#xff1f;今天要聊的FLUX.1-dev-fp8-dit模型&#xff0c;配合SDXL Prompt风格插件&#xff0…...

Mirage Flow 硬件开发入门:Keil5 MDK安装与嵌入式AI项目创建

Mirage Flow 硬件开发入门&#xff1a;Keil5 MDK安装与嵌入式AI项目创建 如果你对把AI模型塞进一个小小的单片机里感到好奇&#xff0c;想亲手试试让硬件“聪明”起来&#xff0c;那么你来对地方了。很多朋友在第一步——搭建开发环境上就卡住了&#xff0c;面对一堆安装包和配…...

SerialMP3库:GD3300D/TD5580A串口MP3模块驱动详解

1. SerialMP3 库概述&#xff1a;面向 GD3300D/TD5580A 串口 MP3 播放模块的嵌入式驱动框架SerialMP3 是一个专为基于 GD3300D 或 TD5580A 音频解码芯片的串口 MP3 播放板设计的 Arduino 兼容库。该库并非通用音频处理中间件&#xff0c;而是一个硬件协议抽象层&#xff08;Har…...

手把手教你用MusePublic:快速生成艺术感时尚人像的保姆级教程

手把手教你用MusePublic&#xff1a;快速生成艺术感时尚人像的保姆级教程 你是不是也曾经被那些充满艺术感的时尚人像照片惊艳到&#xff0c;心里想着“要是我也能做出这样的作品就好了”&#xff1f;但一看到复杂的AI绘画工具&#xff0c;光是安装部署就让人头大&#xff0c;…...

别再只盯着Loss曲线了!TensorBoard的SCALARS面板还有这些隐藏玩法(附GAN训练实战)

解锁TensorBoard SCALARS面板的隐藏战力&#xff1a;从GAN训练曲线中洞察模型灵魂 当你盯着GAN训练中那对纠缠不清的生成器和判别器Loss曲线时&#xff0c;是否感觉像在解读一部悬疑小说&#xff1f;TensorBoard的SCALARS面板远比大多数开发者想象的强大——它不仅是数据的展示…...

5个高效能的LabelImg图像标注效率提升实践

5个高效能的LabelImg图像标注效率提升实践 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Studio, the open s…...

Double Q-learning实战:如何用Python解决过估计问题(附代码示例)

Double Q-learning实战&#xff1a;如何用Python解决过估计问题&#xff08;附代码示例&#xff09; 强化学习中的Q-learning算法因其简洁高效而广受欢迎&#xff0c;但在某些场景下会出现严重的过估计问题。本文将深入探讨这一现象的本质&#xff0c;并手把手教你用Python实现…...

3大维度解析Awesome Claude Skills:重新定义AI效率边界

3大维度解析Awesome Claude Skills&#xff1a;重新定义AI效率边界 【免费下载链接】awesome-claude-skills A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows 项目地址: https://gitcode.com/GitHub_Trending/aw/awesom…...

终极指南:解决Embassy嵌入式框架编译错误的10个技巧

终极指南&#xff1a;解决Embassy嵌入式框架编译错误的10个技巧 【免费下载链接】embassy Modern embedded framework, using Rust and async. 项目地址: https://gitcode.com/gh_mirrors/em/embassy Embassy是一个使用Rust和async/await的现代嵌入式框架&#xff0c;但…...