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

Linux下Java通过JNI调用C++

以下为Demo流程

1.创建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.class

 /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程序的全路径。


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.kler.cn/a/449005.html

相关文章:

  • SQL server学习09-数据库编程(上)
  • GitCode 光引计划投稿|JavaVision:引领全能视觉智能识别新纪元
  • stm32制作CAN适配器5--WinUsb上位机编写
  • Pytorch | 从零构建AlexNet对CIFAR10进行分类
  • 机器学习基础算法 (一)-线性回归
  • 代码随想录D24-25 回溯算法03-04 Python
  • NodeMCU驱动28BYJ-48型步进电机(Arduino)
  • Golang中的Goroutine调度策略
  • 爬虫自动化(DrissionPage)
  • [机器学习]XGBoost(3)——确定树的结构
  • python实现Excel转图片
  • Flutter Visibility控件详解
  • 天锐绿盾加密软件与Ping32两款企业防泄密软件对比:分析文件防止泄露解决方案
  • Qt获取本地计算的CPU温度
  • AI在生活各处的利与弊
  • 青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
  • STM32完全学习——SPI接口的FLASH(DMA模式)
  • 使用GPT进行SCI论文润色常用语句
  • 【医学分割】跨尺度全局状态建模和频率边界指导的分割架构
  • APDL实体模式个性化画网格
  • (15)CT137A- 按键消抖设计
  • Linux Shell 脚本编程基础
  • VIVO Android面试题及参考答案
  • Sigrity SystemSI仿真分析教程文件路径
  • B2HGraphicBufferProducer和H2BGraphicBufferProducer
  • 专题八:背包问题