Linux下Java通过JNI调用C++

embedded/2024/12/30 19:37:43/

以下为Demo流程

1.创建Java文件

java">public class HelloWord {// 声明本地方法public native void sayHello();static {// 加载本地库System.loadLibrary("hello");}public static void main(String[] args) {new HelloWord().sayHello();}
}

2.编译生成.h头文件

在HelloWord.java所在文件夹中打开终端,使用java命令编译.java文件,生成.h文件

 /data/home/UOS/IDEA/jdk/jdk21/bin/javac -h  .  HelloWord.java

 /data/home/UOS/IDEA/jdk/jdk21/bin/javac 为指定jdk所在路径,此时可在文件夹中生成.h文件

文件具体内容如下:

3.创建编写.c文件具体功能代码

4.生成libhello.so文件

完成3之后,在HelloWord.c所在文件夹下使用gcc编译生成.so文件,具体命令如下

gcc -shared -fPIC -o libhello.so -I/data/home/UOS/IDEA/jdk/jdk21/include -I/data/home/UOS/IDEA/jdk/jdk21/include/linux HelloWord.c

5.指定so文件路径,执行程序

可以使用Java命令指定java程序加载.so,我这里使用的是指定.so程序的全路径。

java">
public class HelloWord {// 声明本地方法public native void sayHello();static {// 加载本地库//System.loadLibrary("hello");//System.loadLibrary(LIB_PATH);Path currentRelativePath = Paths.get("");String absolutePath = currentRelativePath.toAbsolutePath().toString();String libPath = Paths.get(absolutePath, "/src/main/java/hc/smart/jni/libhello.so").toString();System.out.println(libPath);System.load(libPath);}public static void main(String[] args) {new HelloWord().sayHello();}
}

执行后即可输出Hello. World

其中System.load(libPath);为加载全路径.so文件方法;若使用System.loadLibrary("hello");则需使用java命令配置.so。

若更改.c文件中的代码,则需重新编译生成.so文件,方可执行最新功能

后续将实现更复杂的功能


http://www.ppmy.cn/embedded/149560.html

相关文章

5.npm包

文章目录 [TOC](文章目录) 3.npm与包3.1.包3.2.npm体验在项目中安装包的命令包管理配置文件一次性安装开发项目时安装的包如何从项目中卸载包devDependencies节点的作用解决下载包速度比较慢的问题nrm工具,利用其提供的终端命令,可以快速查看和切换下包的…

iPhone 17 :史诗级大改,120Hz 全面普及

资深果粉应该都听过一个说法:“iPhone 买单不买双”。这个“规律”似乎在iPhone 16上也得到了印证。 近段时间,各方消息都在指明一点:iPhone 16 只是大餐前的小菜,iPhone 17才是真正带来革命性提升的一代神机。下一代 iPhone 17&…

阿里云人工智能ACP(一)——人工智能与人工智能技术概述

一、人工智能概述 1. 人工智能的定义 人工智能 是利用数字计算机或者由数字计算机控制的机器,模拟、延伸和扩展人类的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术和应用系统。 2. 人工智能的发展 3. 人工智能的分类 4. 人工智能…

网站前端优化

网站前端优化 主要是介绍了这几个规则。 第一:减少HTTP请求 1: 将超链接关联到图片上,例如在导航栏按钮中。如果是以这种形式关联多个带有超链接的图片,使用图片地图这种方式既能减少HTTP请求,有无需改变页面外观感受。图片地…

Vue.js 高级组件开发:抽象与高性能架构

Vue.js 高级组件开发:抽象与高性能架构 引言一、动态组件与依赖注入1. 动态组件场景 二、高可扩展性的抽象组件模式1. 设计思路2. 案例:抽象数据表组件 三、复杂场景下的异步操作管理1. 使用 Vue Composition API 管理异步逻辑 四、渲染优化与框架底层钩…

微信小程序 不同角色进入不同页面、呈现不同底部导航栏

遇到这个需求之前一直使用的小程序默认底部导航栏,且小程序默认入口页面为pages/index/index,要使不同角色呈现不同底部导航栏,必须要在不同页面引用不同的自定义导航栏。本篇将结合分包(subPackages)展开以下三步叙述…

202年寒假充电计划——自学手册 网络安全(黑客技术)

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、…

如何在Facebook发布Reels?简单易懂的操作指南

随着短视频风靡全球,Facebook Reels 成为了吸引用户和推广内容的强大工具。无论你是个人创作者还是企业运营者,掌握 Facebook Reels 的发布技巧都能让你的内容更快触达目标受众。本文将详细介绍如何在 Facebook 发布 Reels,帮助你轻松上手这一…