JAVA调用C语言程序

article/2025/10/16 22:15:21

JAVA调用C语言程序

  • JAVA调用C语言程序
    • 1. 编写带有native声明的方法的Java类
    • 2. 使用javah 生成:jniSample.h的头文件
    • 3. 使用C实现本地sum方法:(这里我生成文件时候,误写了jinSample)。
    • 4. 将本地方法编写的文件生成动态链接库。
    • 5. 再次刷新项目,再使用jniSample.java文件运行代码,得到结果。

JNI:

java Native INterface:JAVA原生数据库
java与C互操作
C调用JAVA程序(基于反射的方法)

JAVA调用C语言程序

JNI实现native方法

本次操作在Mac上,使用eclipse编写java,使用xcode运行c代码,xcode中可以使用gcc。
课程是MOOC上JAVA相关课程
(这里的compile.cmd文件可不关心,我用来存放,第四部步骤的相关命令的)
在这里插入图片描述

1. 编写带有native声明的方法的Java类

 use javah -cp bin jniSample we can get jniSample.h file.
public class jniSample {//要在C中实现的方法sum。public native int sum(int a, int b);public static void main(String[] args) {//加载共享库文件libjniSample.jnilib文件。System.loadLibrary("jniSample");jniSample sample = new jniSample();int Sum = sample.sum(5, 6);System.out.println(Sum);}
}

2. 使用javah 生成:jniSample.h的头文件

use javah -cp bin jniSample we can get jniSample.h file.
在终端,先切换到项目文件夹下:
执行:

javah -cp bin jniSample

刷新项目:在eclipse中,右键项目,refresh即可。得到jniSample,该文件无需更改。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jniSample */#ifndef _Included_jniSample
#define _Included_jniSample
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     jniSample* Method:    sum* Signature: (II)I*/
JNIEXPORT jint JNICALL Java_jniSample_sum(JNIEnv *, jobject, jint, jint);#ifdef __cplusplus
}
#endif
#endif

3. 使用C实现本地sum方法:(这里我生成文件时候,误写了jinSample)。

#include "jinSample.h"
JNIEXPORT jint JNICALL Java_jniSample_sum(JNIEnv *env, jobject obj, jint num1, jint num2){return num1*num2;}void main(){}

4. 将本地方法编写的文件生成动态链接库。

mac下使用gcc生成动态链接库文件
使用: 查看jdk路径

/usr/libexec/java_home -V

再将自己的jdk路径改下,以下是我的jdk路径。

gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/ jinSample.c -o libjniSample.jnilib

提示错误:

/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/jni.h:45:10: fatal error: 'jni_md.h' file not found

使用下列命令copy一份。在运行上述代码。

sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include

5. 再次刷新项目,再使用jniSample.java文件运行代码,得到结果。

30

注意:
这里java文件中加载jniSample.jnilib文件。写的是"jniSample"。但是第四步骤中,写的是:libjniSample.jnilib。该名称前加上:lib。不如运行java代码调用本地sum方法时会报错。


http://chatgpt.dhexx.cn/article/4mAP21sK.shtml

相关文章

Java简单调用C语言函数

Java简单调用C语言函数 1.安装Dev-Cpp2.编写并编译Java代码3.新建工程4.修改C代码4.1将第2步生成的.h文件复制黏贴到dll.h里面4.2修改dllmain.cpp文件4.3 保存并编译4.4编译错误解决 5.将编译好的dll文件放到java安装目录下的bin目录下6.运行 1.安装Dev-Cpp 2.编写并编译Java代…

C 调用 Java 方法

文章目录 1 Java 代码2 C 代码3 总结3.1 获取参数3.2 调用方法 1 Java 代码 JNI 代码 package com.karashok;import java.util.UUID;public class JNIDemo {/*** 获取静态方法返回值*/public static native String sayHello();/*** 获取方法返回值*/public native String say…

java调用c/c++代码

JNI是Java Native Interface的英文缩写, 中文翻译为本地调用, 自从Java 1.1开始就成为了Java标准的一部分。 C/C是系统级的编程语言, 可以用来开发任何和系统相关的程序和类库, 但是Java本身编写底层的应用比较难实现, 使用JNI可以调用现有的本地库, 极大地灵活了Java的开发。…

java调用C++代码

首先我的参考博客如下&#xff1a; https://www.cnblogs.com/CLAYJJ/p/7725975.html https://www.cnblogs.com/xiaocainiao2hao/p/5619862.html https://www.cnblogs.com/langtianya/p/3470896.html 流程如下&#xff1a; 1.建立一个java文件&#xff0c;在这里我只写了一…

C语言调用Java JNI

最近项目中需要使用JNI&#xff0c;所以研究了一下&#xff0c;其中遇到过不少问题&#xff0c;总结一下&#xff0c;让遇到同样问题的人可以得到解决。 在C/C中调用Java的方法一般分为五个步骤&#xff1a;初始化虚拟机、获取类、获取类的方法、创建类对象、调用方法和退出虚…

java程序如何调用C++代码

看到java多线程中的Thread.isAlive()的类型为native&#xff0c;进一步去联想native方法什么时候用呢&#xff1f;自己能不能编写native方法&#xff1f; 经网上查资料&#xff1a; java中native修饰符的含义为“a native method is a java method whose implementation is p…

Java调用C++程序实现方法

Java调用C程序实现方法(1) 这篇博文是自己在学习过程中&#xff0c;踩了很多坑之后&#xff0c;为了避免广大热爱编程的盆友再像我这样浪费太多时间&#xff0c;索性将自己的实现方法总结出来&#xff0c;以供大家参考。程序最终实现的是Hello World效果&#xff0c;话不多说&…

从 C/C++ 程序调用 Java 代码

JNI允许您从本机代码内调用 Java 类方法。 要做到这一点&#xff0c;通常必须使用 Invocation API 在本机代码内创建和初始化一个 JVM。 下列是您可能决定从 C/C 代码调用Java 代码的典型情况&#xff1a; 1.希望实现的这部分代码是平台无关的&#xff0c;它将用于跨多种平台…

使用Java调用C/C++

文章目录 前言JNI概述例子编写Java代码编译生成的class文件:JNITest.class在命令行下使用javah生成C/C头文件。在工程的bin目录下输入以下命令&#xff1a;实现C代码。在VS2008中创建一个Win32 project&#xff0c;类型为DLL。构建C项目将dll文件复制到Java工程的bin目录下 前言…

java调用c/c++

最近项目想将比较重要的配置文件加密、综合考虑后决定用java jni实现&#xff0c;步骤如下 1.定义java本地接口 package com.msg.jni;public class JniMsg {static {try {String os System.getProperty("os.name").toLowerCase();String path "F:/opt/"…

C/C++如何调用Java

前言 简单介绍C/C如何调用Java&#xff0c;内容适合未接触过此类工程的朋友作为上手参考。 一、编译环境 1. 64位的win10系统 2. JDK&#xff1a;jdk-8u181-windows-x64.exe 3. IDE VS2017 二、调用步骤及Java虚拟机使用方法 一般步骤&#xff1a; 编写Java代码, 并编译…

java调用C

文章目录 idea创建一个java类通过命令生成.h文件vs2015创建dll项目修改dll项目的属性补充dll项目的头文件和源文件导入文件源文件的制作 生成dll文件idea导入dll文件idea使用函数 这个确实卡了我一段时间。 先说说必要性吧。 java无法处理的操作&#xff08;指向地址&#xff…

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;