java调用C

article/2025/10/17 0:17:27

文章目录

    • idea创建一个java类
    • 通过命令生成.h文件
    • vs2015创建dll项目
    • 修改dll项目的属性
    • 补充dll项目的头文件和源文件
      • 导入文件
      • 源文件的制作
    • 生成dll文件
    • idea导入dll文件
    • idea使用函数

这个确实卡了我一段时间。

先说说必要性吧。

  1. java无法处理的操作(指向地址)
  2. 用其他语言会方便很多。
  3. 因为其他语言项目很成熟了,不好推掉重来。而我只习惯用java的话,便可以继续使用java工作,只是要调用人家写好的代码。

java调用除了C语言的其他语言都较容易,甚至可以靠导包来完成转换,唯独C难搞,盲猜是因为其可访问物理地址的缘故。

那么java如何调用c?

步骤如下:

1. idea创建一个java类
2. 通过命令生成.h文件
3. vs2015创建dll项目
4. 修改dll项目的属性
5. 补充dll项目的头文件和源文件
6. 生成dll文件
7. idea导入dll文件
8. idea使用函数

idea创建一个java类

严格来说,核心步骤并不是创建一个java类,而是创建一个方法,那个方法要被native修饰,这才是关键。

package cn.hsl.search;public class javaConnectC {public native void hsl(String a,char b,int c);
}

通过命令生成.h文件

操作步骤为:

  1. 找到第一步所创建的java文件
  2. 打开cmd
  3. 输入命令 javac -h ./ [java文件位置]

然后就会在cmd的当前路径下生成一个.h文件,我们把那个.h文件剪切到我们的临时目录里。结束了就可以把目录干掉

那个.h文件名就是我们的包名+类名

例如我的包名加 cn.hsl.search

类名叫javaConnectC

然后.h的文件名就是:cn_hsl_search_javaConnectC

其里面的方法在文件名的基础上,在最前面还要加个Java,最后面还要加上方法名

即:Java_cn_hsl_search_javaConnectC_hsl

vs2015创建dll项目

其实vs2019应该也行的,但我那时候不懂…

新建一个dll项目

把dll项目下的头文件和源文件目录下的文件都可以删了

我命名的dll项目名为javaConnectC,放的目录为桌面/JCC

修改dll项目的属性

右键单机dll项目,找到 属性选项(其实左键单机dll项目,然后alt+enter也可以直接打开)。

会弹出一个对话框,然后找到 配置属性 - VC++ 目录

然后添加VC++ 目录下的包含目录的值,点击包含目录的值,单击最右边的下拉按钮,选择《编辑》

然后选择本地jdk目录下include文件夹,我的是 D:/jdk-14.0.1/include

和选择jdk目录下的include/win32文件夹,我的是 D:/jdk-14.0.1/include/win32

感到难找的话,其实也可以全盘搜索jni.h文件,包含那个文件的jdk就是我们所需要的jdk
在这里插入图片描述

以上是VC++ 目录的修改

然后是预编译头的修改

还是那个属性对话框

找到 配置属性 - C/C++ - 预编译头

在预编译头那里找到预编译头的值,点开最右边的下拉按钮,选择不使用预编译头

在这里插入图片描述

然后就结束了。

补充dll项目的头文件和源文件

导入文件

找到通过命令生成的.h文件,我的是直接放在桌面的。

然后将.h文件复制到dll项目的目录下。即,将 临时目录/javaConnectC.h 复制到 桌面/JCC/javaConnectC/javaConnectC 目录下,反正就是放在原来存放dll项目头文件的位置。

我们再创建一个.c/.cpp文件,如果已经有了,可以也放在原来dll项目的头文件的位置,即桌面/JCC/javaConnectC/javaConnectC 下。

然后去vs的dll项目那里,在头文件和源文件目录那里进行导入头、源文件。

源文件的制作

我的源文件名叫javaConnectC.c文件,其实cpp也行,而且也不必跟.h文件同名

只是对源文件内容有要求,必须导入那个生成的.h文件,即javaConnectC.h文件

然后方法的话,复制.h文件下的 JNIEXPORT所修饰的那段方法。

复制到.c文件那里,然后给方法的形参加上字段。

然后把那个方法当作是main方法,就可以当作是C文件去敲了。

至于传值情况下,貌似传值若是char类的话,便不可用printf去打印char字符。其他String和int都可以

头文件代码:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cn_hsl_search_javaConnectC */#ifndef _Included_cn_hsl_search_javaConnectC
#define _Included_cn_hsl_search_javaConnectC
#ifdef __cplusplus
extern "C" {
#endif/** Class:     cn_hsl_search_javaConnectC* Method:    hsl* Signature: (Ljava/lang/String;CI)V*/JNIEXPORT void JNICALL Java_cn_hsl_search_javaConnectC_hsl(JNIEnv *, jobject, jstring, jchar, jint);#ifdef __cplusplus
}
#endif
#endif

源文件代码:

#include"cn_hsl_search_javaConnectC.h"
#include"stdio.h"
JNIEXPORT void JNICALL Java_cn_hsl_search_javaConnectC_hsl
(JNIEnv * env, jobject obj, jstring str, jchar chr, jint jin) {putchar(chr);printf("this is int: %d\n",jin);printf("this is string: %s\n", str);
}

生成dll文件

接下来直接按 生成 -> 生成xxx项目 即可

在这里插入图片描述

idea导入dll文件

将dll文件放到idea的lib的位置
的位置:找个跑的通的代码,加个静态代码 static{ System.loadLibrary(“aaa”) },然后就会报错,提示我们[lib的位置]上没有这个aaa.dll

其实也可以自己声明一个lib的位置,但我不会做。

idea使用函数

随便找个跑的通的位置,调用第一步创建的那个java类

然后在类下面搞个静态代码块,来提前加载lib

static{System.loadLibrary("javaConnectC");
}

然后就可以在这个类里面直接调用java的那个方法。

package cn.hsl.search;import cn.hsl.dao.mapper.GoodsMapper;
import cn.hsl.dao.pojo.Goods;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class SearchApplicationTest {static {System.loadLibrary("javaConnectC");}@Testvoid ww(){javaConnectC javaConnectC = new javaConnectC();javaConnectC.hsl("HSL",'i',1);}
}

参考了两个作者的步骤

参考 PacosonSWJTU 从创建java类到创建.h文件

参考 你是小KS 怎么将.h文件直接制作成dll

最后我自己摸索了怎么在idea导入dll

至于使用嘛,也是参考了 PacosonSWJTU

PacosonSWJTU 博客网址:https://blog.csdn.net/PacosonSWJTU/article/details/50618022

PacosonSWJTU 博客标题:本地方法(JNI)——从java 程序中调用C函数

你是小KS 博客网址:https://blog.csdn.net/weixin_45492007/article/details/123018918

你是小KS 博客标题:Java:使用javah生成.h文件并完成dll调用

谢幕


http://chatgpt.dhexx.cn/article/WXKtQvCB.shtml

相关文章

Java调用c/c++(JNI)最详细步骤

一、JNI(Java Native Interface)的作用就是Java通过JNI调用其他语言的函数(或方法)&#xff08;主要是C&C&#xff09;。 二、准备 1. java8系列jdk&#xff0c;有很多版本&#xff0c;任选一个即可&#xff0c;如jdk1.8.0.231。安装好&#xff0c;配置好环境。 2. vs20…

使用java调用C语言程序教程

1.idea创建一个java类 严格来说&#xff0c;核心步骤并不是创建一个java类&#xff0c;而是创建一个方法&#xff0c;那个方法要被native修饰&#xff0c;这才是关键。 接着在TestNativeCode类当中声明我们的本地方法&#xff1a; package com.wwj.nativecode; public class T…

linux中文语言包下载地址,centos中文语言包-官方版-centos中文语言包fonts-chinese-3.02-12.el5.noarch.rpm-独木成林...

centos中文语言包 fonts-chinese-3.02-12.el5.noarch.rpm&#xff0c;直接在目录下运行&#xff1a; rpm -ivh fonts-chinese-3.02-12.el5.noarch.rpm linux中文文件名乱码的解决办法(安装中文支持包) 由于安装英文版的系统不支持中文&#xff0c;出现中文文件名乱码。 下面操作…

Linux-centos安装MySQL8.0.22连接驱动文件mysql-connector-java-8.0.22-1.el7.noarch.rpm

目录 1、下载地址 2、选择版本 3、安装驱动 1、下载地址 https://downloads.mysql.com/archives/c-j/ 2、选择版本 选择对应的版本&#xff0c;这里系统选择Redhat系列Linux7&#xff0c;驱动版本选择8.0.22&#xff0c;点击download下载到本地再上传至服务器安装。 也可…

Mysql-MHA 安装过程中遇到的问题 :报错rpm -ivh mha4mysql- manager- 0.56-0.el6.noarch.rpm错误:依赖检测失败:

rpm -ivh mha4mysql- manager- 0.56-0.el6.noarch.rpm 错误&#xff1a;依赖检测失败&#xff1a; perl(Config::Tiny) 被 mha4mysql-manager-0.56-0.el6.noarch 需要 perl(Log::Dispatch) 被 mha4mysql-manager-0.56-0.el6.noarch 需要 perl(Log::Dispatch::File) 被 mha4mysq…

Linux下载并安装rabbitmq-server-3.6.5-1.noarch.rpm

目录 1.安装rabbitmq所需要的依赖包 2.下载安装包 3.安装服务命令 4.修改配置 5.启动rabbitmq 6.rabbitmq控制台安装 7.访问你的虚拟机 ip:15627 会出现下面的页面 用户名和密码都是 guest 8.常用命令 1.安装rabbitmq所需要的依赖包 yum install build-essential o…

centos rpm安装mysql时依赖检测失败:mysql57-community-release 与 mysql80-community-release-el8-3.noarch 冲突

1.出现以上报错&#xff0c;说明MySQL安装版本冲突 首先卸载原来的MySQL rpm -qa |grep mysql //搜索安装的MySQL包rpm -e --nodeps 搜索出来的包名 //卸载示例&#xff1a; [rootcentos8s ~]# rpm -qa |grep mysql mysql57-community-release-el7-11.noarch [rootcent…

yum 安装daemonize 错误:依赖检测失败: daemonize 被 jenkins-2.303.1-1.1.noarch 需要

错误&#xff1a;依赖检测失败&#xff1a; daemonize 被 jenkins-2.303.1-1.1.noarch 需要 安装 epel-release yum -y install epel-release安装 daemonize yum -y install daemonize结果&#xff1a;

php代码解决乱码问题

在用php的passthru函数的时候&#xff0c;然后出现了乱码的情况 代码&#xff1a; <?php echo passthru("ipconfig"); ?> 解决方法&#xff1a; 在原来的代码前面加 header("content-type:text/html;charsetgbk2312"); charset——后面是修改…

PHP-MySQL乱码[?]问题处理

PHP-MySQL乱码[?]问题处理 PHP-MySQL乱码[?]问题处理问题展示原因分析查看数据库编码格式WindowsLINUX 解决方案1、修改MySQL配置文件2、修改php连接数据库的编码格式。 修改后结果展示 PHP-MySQL乱码[?]问题处理 问题展示 php执行sql语句返回结果为’???’ 原因分析…

PHP文件乱码解决

1.查看项目的编码格式是不是UTF-8 2.在页面的开始处加入下面代码 <?php header("content-type:text/html;charsetutf-8"); //设置编码 ?>3.如果是html和PHP语言混合的PHP文件&#xff0c;还需要<head>标签下&#xff0c;加如下代码&#xff1a; <…

php如何解决中文乱码问题?

首先 乱码为什么会发生&#xff1f; 乱码的发生大致有2种原因&#xff0c;一种是编码(charset) 设置错误&#xff0c;导致浏览器以错误的编码来解析&#xff1b;另一种是文件被以错误的编码打开&#xff0c;然后保存&#xff0c;比如一个文本文件原先是GB2312 编码的&#xff…

php页面上显示中文乱码怎么解决,php输出中文乱码问题怎么解决?,php页面中文显示乱码...

php输出中文乱码问题怎么解决&#xff1f;怎么解决PHP输出中汉字乱码问题&#xff1f;&#xff0c;解决方案&#xff1a;1。对于HTML和PHP混合的页面&#xff0c;应该使用元标签或者header()函数来统一页面编码&#xff1b;2.对于纯PHP的静态页面&#xff0c;使用header()函数将…

解决html、php中文乱码问题

我们将乱码情况分为以下几种&#xff0c;有需要的可以对照下面的几种情况有针对性的解决乱码问题 第一种&#xff1a;解决HTML中中文乱码问题方法 如果你的HTML文件文件出现了乱码问题&#xff0c;那么你可以在head标签里面加入UTF8编码(国际化编码)&#xff1a;UTF-8是没有国…

解决 PHP 输出中文乱码的问题

本文由荒原之梦原创&#xff0c;原文链接&#xff1a;http://zhaokaifeng.com/?p1340 解决 PHP 输出中文乱码的问题 问题描述 今天给导航狗(https://daohanggou.cn/)的 PHP 程序和数据库文件迁移了服务器, 但是迁移到新的服务器上之后 PHP 输出的中文和 PHP 输出的从 MySQL…

原创:PHP乱码怎么办?五种方法彻底解决PHP乱码问题

对于刚接触PHP的新手来说&#xff0c;乱码可能会让你边临崩溃&#xff0c;但是你要习惯&#xff0c;既然想学好PHP&#xff0c;乱码是家常便饭&#xff0c;不管是老鸟还是新手&#xff0c;都会遇到乱码的问题&#xff0c;下面是我总结的几个常见并且有效的解决方法&#xff1a;…

win7 装MacOS虚拟机做iOS开发

1. 下载安装Vmware Player 2. 下载MacOS10.6 Image http://www.verycd.com/topics/2897839/ [Mac.OS.X.操作系统].Mac.OS.X.Lion.10.7.VMware.Pre-Installed.Image.zip 详情 转载于:https://www.cnblogs.com/technical/archive/2012/04/13/2445417.html

求助。VMware上的MacOS虚拟机安装出现蓝色界面

请教&#xff01;联想小新air14IWL可以安装什么版本得MacOS镜像呢&#xff1f; 目前尝试了两个版本好像是10.15和10.12&#xff0c;截图放下面了 进去总是显示最后那张&#xff0c;根据教程虚拟机的文件目录里也都做了更改还是没有变化 请问是版本的问题还是什么有问题&…

自制macOS安装镜像iso虚拟机用

在网上下载的用于在虚拟机中安装的镜像版本相对比较旧。安装完成后还要进行升级比较麻烦。于是我就想自己制作安装镜像了。 精华 #创建空白磁盘镜像 hdiutil create -o /tmp/ventura -size 13800m -volname ventura -layout SPUD -fs HFSJ #挂载上面创建的镜像 hdiutil attac…

macOS虚拟机搭建Python和Go环境并编写HelloWorld程序

本文的虚拟机是macOS Catalina 10.15.3。 前言 本文将采用Homebrew&#xff08;包管理工具&#xff09;来安装Python和Go&#xff0c;Homebrew的安装必须有Command Line Tools&#xff08;Xcode可以安装该工具&#xff09;配合&#xff0c;由于macOS虚拟机难以在商店直接获取C…