IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> window与linux环境下,java调用c语言的方法 -> 正文阅读

[系统运维]window与linux环境下,java调用c语言的方法

windows环境下,java调用c语言的方法

1.环境

  • C语言编译器:工具比较多,本文使用的是gcc,带gcc的软件业比较丰富,我使用的是TDM-GCC, 注:网上很多使用的是MinGW,但我遇到了很多坑,最终在联想软件商店中下载的TDM-GCC,nice
  • java环境

2.编写native方法java工具类,主要负责与本地native方法链接,不负责业务逻辑

package com.xieshaoping.jni;

/**
 * @author XieShaoping
 */
public class NativeEntity {

    public native String getNativeMsg();

    public NativeEntity(String filename) {
        System.load(filename);
    }

}

3.编写调用native方法java的类,主要负责业务逻辑

package com.xieshaoping.jni;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author XieShaoping
 */
@RestController
public class LoadlibraryController {

    @RequestMapping("loadlibrary")
    public String loadlibrary(String lib) {
        NativeEntity nativeEntity = new NativeEntity(lib);
        String msg = nativeEntity.getNativeMsg();
        System.out.println(msg);
        return msg;
    }

}

4.编译java生产class

javac NativeEntity.java

5.使用javah生成标头文件

javah -jni com.xieshaoping.jni.NativeEntity

注:直接输入javah -jni NativeEntity时会报错的,因为java有page的概念,需要在根目录下运行上述,命令

此时生产了com_xieshaoping_jni_NativeEntity.h文件

编写C语言

#include<stdlib.h>
#include<string.h>
#include <stdio.h>  
#include <math.h>
#include <windows.h> //linux下,需要注释
#include "com_xieshaoping_jni_NativeEntity.h"

JNIEXPORT jstring JNICALL Java_com_xieshaoping_jni_NativeEntity_getNativeMsg(JNIEnv* env, jobject obj) //一定要与.h里的保持一致
{
        //打印内容
        char *msg = "正在调用本地本地native方法-windows";
	    printf(msg);
	    //char * 转为jstring
	    jclass strClass = (*env)->FindClass(env, "java/lang/String");
        jmethodID ctorID = (*env)->GetMethodID(env, strClass, "<init>","([BLjava/lang/String;)V");
        jbyteArray bytes = (*env)->NewByteArray(env, strlen(msg));
        (*env)->SetByteArrayRegion(env, bytes, 0, strlen(msg), (jbyte *) msg);
        jstring encoding = (*env)->NewStringUTF(env, "utf-8");
        return (jstring) (*env)->NewObject(env, strClass, ctorID, bytes, encoding);
}

7.gcc生成类库文件

gcc -m64  -Wl,--add-stdcall-alias -I"D:\MyTool\Java\jdk1.8.0_251\include" -I"D:\MyTool\Java\jdk1.8.0_251\include\win32" -shared WindowsNative.c

-m64 生成64位

-o 命名,默认a.exe

8.运行程序

http://localhost:8080/loadlibrary?lib=D%3A%5CMyProject%5Cjni%5Csrc%5Cmain%5Cjava%5Ccom%5Cxieshaoping%5Cjni%5Ca.exe

显示C语言方法输出的内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FAEftsBN-1646899518820)(img.png)]

linux环境下,java调用c语言的方法

与windows大部分相同, 不同处:

  • 删除“#include <windows.h>”
  • 添加java环境变量
export JAVA_HOME=/root/jdk1.8.0_311
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib
  • gcc生成类库文件
gcc -I"/root/jdk1.8.0_311/include" -I"/root/jdk1.8.0_311/include/linux" -fPIC -shared LinuxNative.c

默认生成a.out文件

运行成功
在这里插入图片描述

大功告成!

附代码:
https://gitee.com/xieshaoping/jni
在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:36:33  更:2022-03-11 22:37:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:16:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码