【Java 28岁了】一个有趣的例子,再推荐一些经典好书(文末惊喜福利)

news2025/4/19 19:24:24

文章目录

  • 1 写在前面
  • 2 C语言与Java语言的互相调用
    • 2.1 C语言调用Java语言
    • 2.2 Java语言调用C语言
  • 3 友情推荐
  • 4 更多分享

1 写在前面

众所周知,C语言和Java语言是两种不同的编程语言,它们的关系可以描述为Java语言是在C语言的基础上发展而来的一种高级编程语言。C语言是一种面向过程的编程语言,主要用于系统编程和底层开发,而Java语言则是一种面向对象的编程语言,主要用于开发跨平台的应用程序和Web应用。Java语言在语法和语义上受到C语言的影响,例如Java语言的基本数据类型和运算符与C语言类似。此外,Java语言的编译器和虚拟机也是使用C语言编写的。因此,C语言和Java语言之间有一定的联系和相互影响。

本文将以C语言与Java语言的互相调用为主题切入,带大家领悟一下其他的一些工程用法。

2 C语言与Java语言的互相调用

C语言和Java的调用方式不同。C语言可以通过JNI(Java Native Interface)调用Java代码,而Java则可以通过JNA(Java Native Access)调用C代码。在C语言中,需要编写JNI接口来将C代码与Java代码连接起来。首先需要编写一个C函数,并使用JNIEXPORT宏将其导出为JNI接口函数。然后在Java代码中使用System.loadLibrary()方法加载C语言编译后的动态链接库,并使用native关键字声明与C函数对应的Java本地方法。在Java中调用C代码时,需要使用JNIEnv结构体中的函数指针来调用C函数。而在Java中调用C代码时,只需要使用JNA库中的函数即可,无需编写接口。

2.1 C语言调用Java语言

以下就是一个C语言调用Java语言的简单例子:

首先,我们需要编写一个Java类,用于被C语言调用。这里我编写了一个简单的Java类,用于计算两个整数的和:

public class Adder {
    public int add(int a, int b) {
        return a + b;
    }
}

接下来,我们需要将这个Java类编译成一个可执行的jar包。假设我们将这个Java类保存在名为Adder.java的文件中,那么我们可以使用以下命令将其编译成jar包:

javac Adder.java
jar cvf Adder.jar Adder.class

这将生成一个名为Adder.jar的jar包,其中包含了我们编写的Java类。

接下来,我们需要编写一个C语言程序,用于调用这个Java类。这里我编写了一个简单的C语言程序,用于调用Adder类的add方法:

#include <jni.h>
#include <stdio.h>

int main() {
    JavaVM *jvm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    JavaVMOption options[1];
    jclass adder_class;
    jmethodID add_method;
    jint result;

    // Set the classpath to the location of the Adder.jar file
    options[0].optionString = "-Djava.class.path=./Adder.jar";

    // Set the Java VM arguments
    vm_args.version = JNI_VERSION_1_8;
    vm_args.nOptions = 1;
    vm_args.options = options;
    vm_args.ignoreUnrecognized = JNI_FALSE;

    // Create the Java VM
    JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);

    // Get a reference to the Adder class
    adder_class = (*env)->FindClass(env, "Adder");

    // Get a reference to the add method of the Adder class
    add_method = (*env)->GetMethodID(env, adder_class, "add", "(II)I");

    // Call the add method of the Adder class
    result = (*env)->CallIntMethod(env, (*env)->NewObject(env, adder_class, (*env)->GetMethodID(env, adder_class, "<init>", "()V")), add_method, 1, 2);

    // Print the result
    printf("Result: %d\n", result);

    // Destroy the Java VM
    (*jvm)->DestroyJavaVM(jvm);

    return 0;
}

这个C语言程序首先创建了一个Java虚拟机,并设置了类路径,然后获取了Adder类的引用,并获取了add方法的引用。最后,它调用了add方法,并打印了结果。

注意,这个C语言程序需要链接到Java虚拟机库。在Linux系统中,您可以使用以下命令来编译和链接这个程序:

gcc -o main main.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -L${JAVA_HOME}/jre/lib/amd64/server -ljvm

其中,${JAVA_HOME}是您的Java安装目录。

如果你有编程条件,可以把代码拉下去,试试看。

2.2 Java语言调用C语言

下面是一个完整的Java调用C语言的示例代码:

C语言代码(test.c):

#include <stdio.h>

int add(int a, int b) {
    return a + b;
}

Java代码(Test.java):

public class Test {
    static {
        System.loadLibrary("test"); // 加载C语言编译生成的动态链接库
    }

    // 声明native方法
    public native int add(int a, int b);

    public static void main(String[] args) {
        Test test = new Test();
        int result = test.add(1, 2);
        System.out.println("result: " + result);
    }
}

编译C语言代码生成动态链接库:

gcc -shared -o libtest.so test.c

编译Java代码:

javac Test.java

运行Java代码:

java Test

输出结果:

result: 3

注意事项:

  1. C语言代码需要编译生成动态链接库(Linux下为.so文件,Windows下为.dll文件)。
  2. Java代码中需要使用System.loadLibrary方法加载C语言编译生成的动态链接库。
  3. Java代码中需要声明native方法,并使用native关键字修饰。
  4. 编译Java代码时需要将当前目录添加到classpath中,否则会报找不到类的错误。

3 友情推荐

Java诞生日,推荐Java“此生错过必遗憾”系列书单

Java28岁了,当打之年,并且还会打很多年。

为即将或正在使用Java的你推荐 Java“此生错过必遗憾”系列书单。看看你还缺哪本?请补齐。优惠购书链接就在文中,拿好不谢。


img

Java核心技术第12版开发基础+高级特性(套装共2册)

“Java四大名著”之一Core Java最新版,一键打包全套2册!建议入门小白和准备升级到Java17的开发者购买。本书根据Java17新特性全面升级!赠送作者亲授视频课+海量代码集。

链接:http://product.dangdang.com/29551728.html


img

Java核心技术第1版 基础知识+高级特性(套装共2册)

“Java四大名著”之一Core Java次新版,一键打包全套2册!建议实际生产环境仍在使用Java8、Java11开发且暂时没有升级版本打算的开发者购买。本书基于Java9-11编写,赠送作者亲授视频课+海量代码集。

链接:http://product.dangdang.com/1584611092.html


img

Java编程思想[Thinking in Java]

“Java四大名著”之一,需要有一定编程基础的人才可阅读,即使很多内容还无法理解,但每次读完一定会有所收获。本书单最前面推荐的《Java核心技术》侧重技术,而《Java编程思想》侧重于“思想”,本书为你剖析Java中各个内容的设计理念。这是一本伴随我们技术成长的好书,买一本放在旁边,摸着就有底气。

链接:http://product.dangdang.com/9317290.html


img

Effective Java 中文版(原书第3版)

Java之父James Gosling:

“我很希望我10年前就能拥有这本书。有人可能认为我不需要任何Java方面的书籍,但是我需要这本书。”

“Java四大名著”之一,适合已经掌握Java核心技术的程序员,想更加深入地了解Java编程语言的开发者阅读。针对如何编写高效、设计优良的程序提出了最实用、最权威的指导方针,通过90条简短、独立的经验法则,探索新的设计模式和语言习惯用法,帮你更加有效地使用Java编程语言及其基本类库,指引你少走弯路。这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。是Java开发人员案头上的一本不可或缺的参考书。

链接:http://product.dangdang.com/26437835.html#ddclick_reco_reco_relate


img

Java语言程序设计基础篇+进阶篇(原书第12版)(套装共2册)

本套书相较于《Java核心技术》更加的基础,如果你阅读《Java核心技术》有些吃力,建议从本书读起。畅销20余年的“长城书”一键打包全套!被世界各地的大学选作教材,更新至Java9、10和11。本书通过示例讲解问题求解技巧,提供大量的程序清单,每章配有丰富的复习题和编程练习题,帮助读者掌握编程技术并解决实际开发中遇到的问题。

链接:http://product.dangdang.com/11388901254.html


img

Java并发编程实战

让注重实战的你更快领悟Java并发编程的要领,快速构建大规模并发应用程序。“Java四大名著”之一《Effective Java》的作者Joshua Bloch参与编写。本书是Java并发编程领域的里程碑著作!从并发编程的基本理论入手,逐步介绍了在设计Java并发程序时各种重要的设计原则、设计模式与思维模式。另一本蚂蚁金服方腾飞老师写的《Java并发编程的艺术》也适合一并阅读。

链接:http://product.dangdang.com/22606835.html


img

软件架构实践(原书第4版)

让你少走弯路的进阶架构师避坑指南!图书届奥斯卡Jolt大奖双冠王作品!全球10余个国家出版。卡内基梅隆等名校教材,IEEE杂志10佳图书,软件架构图书事实标准。

链接:http://product.dangdang.com/29509971.html


了解更多好书点击:http://h5.dangdang.com/mix_gys_04001_lzln

4 更多分享

本期给大家推荐了好多Java的好书,如果有你感兴趣的书本,记得找我哦,有特殊购书优惠哦。欢迎来我的社区了解更多福利活动。Java 28岁了!这些好书推荐给你!-CSDN社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网如何映射到公网访问互联网

我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联网&#x…

Springboot +spring security,使用过滤器方式实现验证码功能

一.简介 在前面文章章节通过自定义认证器实现了验证码功能&#xff0c;这篇文章使用过滤器来实现验证码功能。 二.思路分析 实现逻辑和通过过滤器实现json格式登录一样&#xff0c;需要继承UsernamePasswordAuthenticationFilter&#xff0c;所以文档这块主要记录下代码实现…

每日一题——两数之和(返回下标和返回数值两种情况)

每日一题 两数之和 题目链接 思路 注&#xff1a;本题只采用暴力解法&#xff0c;时间复杂度为O(n2)&#xff0c;如果采用哈希表&#xff0c;可以将时间复杂度降到O(n)&#xff0c;但由于笔者还未对哈希表展开学习&#xff0c;故不做讨论 我们直接用两层for循环来解决问题 第…

安装部署 Mastodon 长毛象去中心化微博系统

注意&#xff1a;本文采用的为 Docker Compose 方式安装部署。 首先选择你安装的版本&#xff0c;有以下两种推荐&#xff1a; 官方版本&#xff1a; https://github.com/mastodon/mastodonGlitch 版本&#xff1a; https://github.com/glitch-soc/mastodon 项目包含一个 Doc…

不同的去耦电容 阻抗VS频率

不同的去耦电容 阻抗VS频率 • 并联电容可以在一个较宽的频带内降低阻抗 • 小的去耦电容尽可能靠近电源引脚 为什么每个电源引脚都需要去耦 去耦电容总结 • 旁路电容离电容引脚尽可能的近 • SMT磁珠对于降低Ripple非常有效 • 高频时需要地平面 – 最小化寄生参数 • 使用…

记两道小明文攻击题

题一 题目描述&#xff1a; flag **************************** flag "asfajgfbiagbwe" p getPrime(2048) q getPrime(2048) m1 bytes_to_long(bytes(flag.encode()))e1e2 3087 n p*q print()flag1 pow(m1,e1,n) flag2 pow(m1,e2,n) print(flag1 str(fla…

MATLAB 搜索某一点的R邻域点 (13)

MATLAB 搜索某一点的R邻域点 (13) 前言一、算法介绍1.1 :无序点云的R邻域点搜索1.2 :有序点云的R邻域点搜索二、具体实现示例2.1 算法一 (含详细注释)2.2 算法二 (含详细注释)前言 在点云处理中,最基本的算法之一就是搜索某一点的近邻点,这在重叠区域确定,点云密度…

Spring Gateway使用JWT实现统一身份认证

在开发集群式或分布式服务时&#xff0c;鉴权是最重要的一步&#xff0c;为了方便对请求统一鉴权&#xff0c;一般都是会放在网关中进行处理。目前非常流行的一种方案是使用JWT&#xff0c;详细的使用说明&#xff0c;可以找相关的资料查阅&#xff0c;这里先不进行深入的引用了…

鲸图知识图谱平台,助力金融业务深度洞察(上)

导语 大数据时代的背景下&#xff0c;数据早就成为数字经济重要的生产资料。对数据的挖掘能力成为企业数字化转型的驱动力。就金融行业来说&#xff0c;如果经营和管理方式跟不上大数据时代的发展脚步就会使得数据价值无法得到充分发挥。知识图谱作为一个结合了知识存储、知识…

SpringCloud入门概述;微服务入门概述

微服务入门概述 入门概述微服务分布式微服务架构Spring Cloud技术栈spring cloud各个组件的使用服务注册服务调用服务降级服务网关服务配置服务总线 参考 入门概述 auther JaneOnly date 2022/11/6 前置课程需要: java8mavengitNginxmqspringboot2.0 微服务 微服务架构就是一…

【阅读笔记】概率预测之DeepAR(含Pytorch代码实现)

本文作为自己阅读论文后的总结和思考&#xff0c;不涉及论文翻译和模型解读&#xff0c;适合大家阅读完论文后交流想法&#xff0c;关于论文翻译可以查看参考文献。论文地址&#xff1a;https://arxiv.org/abs/1704.04110 DeepAR 一. 全文总结二. 研究方法三. 结论四. 创新点五…

软件设计师--考前查漏补缺

软件设计师 上午题一、计算机系统二、操作系统三、数据库技术四、计算机网络五、软件工程概论六、程序设计语言与编译原理七、数据结构与算法八、算法分析与设计九、其他&#xff1a;标准化与知识产权、英语 下午题一、结构化分析设计二、数据库分析技术三、面向对象分析技术四…

代码随想录算法训练营第十四天|二叉树的遍历

这里主要掌握两种遍历方法&#xff1a;递归法和迭代法 递归法&#xff1a; 1、确定递归函数的参数和返回值&#xff0c;这里参数就是节点和用于存放节点数值的vector。 2、确认终止条件&#xff0c;这里的终止条件是节点为空。 3、确定单层递归逻辑&#xff0c;根据前序、中序…

随身WIFI折腾日记(三)---Docker+ssh远程访问+青龙面板

四、安装Docker 安装完Docker以后&#xff0c;我们便可以一键部署一些服务上去了。 sudo curl -fsSL get.docker.com -o get-docker.sh # 下载安装脚本 \&& sudo sh get-docker.sh --mirror Aliyun # 执行安装脚本 \&& sudo systemctl enable docker # 加入开…

一篇文章弄懂卷积神经网络基础概念

文章目录 一篇文章弄懂卷积神经网络基础概念下采样和上采样卷积普通卷积空洞卷积转置卷积膨胀卷积和转置卷积的区别 池化最大池化平均池化 全连接 一篇文章弄懂卷积神经网络基础概念 卷积神经网络可以说是图像处理的天花板&#xff0c;也是当下图像处理在深度学习方面最热门的…

2023/5/23总结

super关键字 super关键字的用法和this 关键字的用法相似 this:代表本类对象的引用&#xff08;this关键字指向调用该方法的对象一般我们是在当前类中使用this关键字&#xff0c;所以我们常说this代表本类对象的引用&#xff09;super:代表父类存储空间的标识(可以理解为父类对象…

AGV/AMR控制器--仙工

AGV/AMR控制器--仙工 1 行业介绍1.1 控制器概念1.2 行业发展1.3 竞争格局 2 仙工控制器 SRC2.1 介绍2.2 优势标准化软硬件&#xff0c;适配多种运动模型超强适配性&#xff0c;适配各大品牌支持车型多样&#xff0c;应对场景复杂灵活应对非标需求 2.3 产品矩阵2.4 实施工具Robo…

CLIP使用教程

文章目录 前言注意使用其他示例 原理篇 前言 本文主要介绍如何调用Hugging Face中openai提供的CLIP API. 注意 如果碰到模型无法自动下载&#xff0c;可手动下载到本地&#xff0c;注意本地调用路径后缀加/。 下载config.json、preprocessor_config.json、pytorch_model.bi…

热乎的过万字GameFramework讲解笔记文档

往期文章分享 点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 本文约15千字&#xff0c;新手阅读需要27分钟&#xff0c;复习需要12分钟 【收藏随时查阅不再迷路】 &#x1f449;关于作者 众所周知&a…

YOLOv5改进系列(5)——替换主干网络之 MobileNetV3

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2&#