首页 > 编程语言 >java于C配合

java于C配合

时间:2024-01-14 17:48:22浏览次数:29  
标签:java GPUMonitor 1.8 配合 env include native

    虽然没有完成全部过程,最后卡在调用时报错,但还是记录下过程:

1、创建java类,声明native方法

package com.example.gpumonitor;

public class GPUMonitor {
    static {
        System.loadLibrary("gpumonitor"); // 加载对应平台的动态链接库
    }

    public native String getGPUUsage(); // 声明native方法

    public static void main(String[] args) {
        GPUMonitor monitor = new GPUMonitor();
        String gpuUsage = monitor.getGPUUsage();
        System.out.println("GPU Usage: " + gpuUsage);
    }
}

2、编译java类,会有.class文件生成

javac GPUMonitor.java

3、生成jni头文件,可以通过maven直接打包生成增加红色字体的配置,会在include目录下生成GPUMonitor.h文件。用javah(老sdk)或java(新sdk)没有成功。

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version> <!-- 使用当前稳定版本 -->
        <configuration>
          <compilerArguments>
            <h>target/native/include</h> <!-- 指定头文件输出目录 -->
          </compilerArguments>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>

4、创建C文件,编写native方法。编译的时候可能需要指定jni.h的位置:

#include "GPUMonitor.h"
#include <jni.h>
#include <stdio.h>
#include <string.h>

JNIEXPORT jstring JNICALL Java_com_example_gpumonitor_GPUMonitor_getGPUUsage(JNIEnv *env, jobject obj) {{
    char command[100] = "nvidia-smi";
    FILE* pipe = popen(command, "r");
    if (!pipe) return (*env)->NewStringUTF(env,"Failed to run command");

    char buffer[128];
    char result[4096] = "";
    while(fgets(buffer, 128, pipe) != NULL)
    {
        strncat(result, buffer, sizeof(buffer) - 1);
    }

    pclose(pipe);
    return (*env)->NewStringUTF(env,result);
}

5、编译、链接C代码,linux下生成so文件。可能需要指定jni.h的位置,带上-I参数。

gcc -I/usr/lib/jvm/java-1.8.0-openjdk-1.8/include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8/include/linux -shared -fPIC -o gpumonitor.so GPUMonitor.c

6、在java中调用C的so库,可惜到这一步报错,说找不到类

GPUMonitor monitor = new GPUMonitor();
String gpuUsage = monitor.getGPUUsage();

  因为改变了方案,此路没通,也没再继续研究路。此处仅做记录。

标签:java,GPUMonitor,1.8,配合,env,include,native
From: https://www.cnblogs.com/badwood316/p/17963937

相关文章

  • java后端设置Cookie和响应Cookie
    @Slf4j@RestController@CrossOriginpublicclassLoginController{@GetMapping("/c1")publicResultcookie1(HttpServletResponseresponse){response.addCookie(newCookie("Login_user","zwj"));returnnew......
  • 【JAVA基础】Java项目开发工具之Maven
    JAVA开发工具IDE有哪些?eclipce、idea、vscode等等IDEA比Eclipse更强大和高效。IDEA提供了更好的代码补全和重构功能,更好的代码导航和搜索功能,以及更好的支持多模块项目和多语言开发等。构建项目工具构建项目工具有哪些?Maven、Gradle、Ant等Maven管理和构建项目以及维护......
  • SparkSQL in Java
    参考地址:StartingPoint:SparkSession1.新建Maven项目,POM引入依赖<dependencies><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.13</artifactId><version&......
  • Java小细节之循环标号
    importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);intn=in.nextInt();out:for(inti=0;i<=n;i++){for(intj=0;j<=n/2;j++){for(intz=0;z<=n/5;z++){if(i+j......
  • 第一章:Java语言概述
    1.注释注释的类型:单行注释多行注释文档注释注释的作用:提高了程序的可阅读性用于调试程序的重要方法2.Java核心机制:JVM优点:跨平台性面向对象性健壮性安全性高简单性高性能缺点:语法过于复杂严谨一般适用于大型网站开发,维护成本高并非适用于所有领域2......
  • 开始学习Java - Day1
    学习Java目标掌握一门编程语言可以看懂代码,具备编程能力。WhyJava(vspython)相比较Python,更原生态,更灵活。(Python只是上手简单,仅此而已)Java封装好了,调用是一样的学完Java,再学习其他语言,会更快一些。如PHP,Python具体解决问题,底层更多的是看算法学习方法写代码......
  • 详解Java之Spring框架中事务管理的艺术
    第1章:引言大家好,我是小黑,咱们今天聊聊Spring框架中的事务管理。不管是开发小型应用还是大型企业级应用,事务管理都是个不可避免的话题。那么,为什么事务管理这么重要呢?假设在银行系统中转账时,钱从A账户扣了,但没到B账户,这种情况就是事务管理处理不当的后果。显然,我们需要一种机制来......
  • JavaImprove--Lesson06--正则表达式
    一.正则表达式的入门正则表达式是一些特定支付组成的,代表一个规则,简化代码,以字符的形式体现规则正则表达式,又称规则表达式,(RegularExpression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。......
  • 大型JAVAEE医疗 项目介绍
    一项目介绍1简介云医疗项目属于微医云医疗技术部组建的项目,目前微医全科已开业八家,专注于为个人、家庭和企业提供预防、诊断、治疗、康复,高端体检等一站式的健康维护和医疗服务,打造中国医疗界的"星巴克",未来,微医全科高品质的健康医疗服务基地将继续在全国各地开枝散叶。云医疗......
  • Java多线程编程实战指南(设计模式篇)PDF
    随着CPU多核时代的到来,多线程编程在充分利用计算资源、提高软件服务质量方面扮演了越来越重要的角色。而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案。然而,多线程编程相关的设计模式书籍多采用C++作为描述语言,且书中所举的例子多与应用开发人员的......