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

这篇具有很好参考价值的文章主要介绍了【Java 28岁了】一个有趣的例子,再推荐一些经典好书(文末惊喜福利)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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“此生错过必遗憾”系列书单。看看你还缺哪本?请补齐。优惠购书链接就在文中,拿好不谢。


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

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

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

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


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

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

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

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


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

Java编程思想[Thinking in Java]

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

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


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

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

Java之父James Gosling:

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

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

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


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

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

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

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


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

Java并发编程实战

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

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


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

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

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

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


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

4 更多分享

本期给大家推荐了好多Java的好书,如果有你感兴趣的书本,记得找我哦,有特殊购书优惠哦。欢迎来我的社区了解更多福利活动。Java 28岁了!这些好书推荐给你!-CSDN社区文章来源地址https://www.toymoban.com/news/detail-493593.html

到了这里,关于【Java 28岁了】一个有趣的例子,再推荐一些经典好书(文末惊喜福利)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用java写一个对接flink的例子

    Maven依赖: 其中, flink.version 和 scala.binary.version 都需要替换为实际使用的版本号。 模拟数据生成: 这个程序使用 Flink 的 generateSequence() 方法生成 1000 个从 0 到 999 的数字作为模拟数据,将它们转化为字符串并拼接成键值对,然后使用 Flink 的 Kafka 生产者将数据写入到 Kafka 的

    2024年02月15日
    浏览(41)
  • 【Java】一个简单的接口例子(帮助理解接口+多态)

    要求: 请实现笔记本电脑使用USB 鼠标、 USB 键盘的例子 1. USB 接口:包含打开设备、关闭设备功能 2. 笔记本类:包含开机功能、关机功能、使用 USB 设备功能 3. 鼠标类:实现 USB 接口,并具备点击功能 4. 键盘类:实现 USB 接口,并具备输入功能 (不需要具体实现,给出框架即

    2024年02月16日
    浏览(44)
  • 【经典算法】有趣的算法之---遗传算法梳理

    every blog every motto: You can do more than you think. 遗传算法是一种基于自然选择和遗传机制的优化算法,因此它通常被用于求解各种最优化问题,例如函数优化、特征选择、图像处理等。 一言以蔽之: 将数学中的优化问题,首先通过“编码”将数字变成“0101”类似这种二进制形式

    2024年01月17日
    浏览(66)
  • Java转Go:java开发者转学go语言,请给我一些建议和学习推荐

    在做开发时遇到最无理的需求就是部门没了😂 遇到最无理的需求就是部门没了😂,差点人也在这个公司没了,但好在是跟着大部队换了一个部门,就是要转go,也可能要用js和solidity开发 一开始知道部门没了,第一时间一定是会担心,甚至后面知道有的同事要被毕业,有的同

    2024年02月13日
    浏览(52)
  • 对于零基础小白来说,转行学云计算和java哪个更好一些?求推荐

    对于零基础小白来说,转行学云计算和java哪个更好一些? 云计算和Java是两个不同的技术领域,虽然它们都与计算机网络、分布式系统和互联网应用程序等相关,但它们的学习重点和应用场景也不同。虽然他们都是非常有前途的IT领域,但对于零基础的小白来说,选择学习云

    2024年02月11日
    浏览(47)
  • C语言一些有趣的冷门知识

    本文章只是介绍一些有趣的C语言知识, 纯属娱乐 。这里所有的演示代码我是使用的 编译器是Visual Studio Code,版本为1.81.0 除了常规用法之外,我们也可以使用如下这种方法进行使用。 运行结果 除了常规用法之外,我们也可以 使用: :来代替[ ] 。 运行结果 除了常规用法之外

    2024年02月13日
    浏览(38)
  • 【经典算法】有趣的算法之---粒子群算法梳理

    every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?type=blog 粒子群算法 粒子群算法(Particle Swarm Optimization,PSO)是一种用于解决优化问题的元启发式算法。它通过模拟鸟群或鱼群中的行为来进行优化搜索。 在粒子群算法中,问题的潜在解被表示为一群粒子

    2024年04月09日
    浏览(37)
  • 用python画一些有趣的图案(001)

    1、python画迪斯科灯  2、Python画随机雨点  3、Python画五彩螺旋 五彩螺旋2    

    2024年02月11日
    浏览(47)
  • 分享一些自己想到的有趣的编程比赛队名

    xxx为自己的学校 Make xxx Great Again!!! ying ying ying/win win win 重振(铸)xx荣光,我辈义不容辞 假装队伍里有女生 在小小的花园里,挖呀、挖呀、挖! 我承认阁下很强,但如果在下掏出了女装/chatgpt,阁下该如何应对 更适合中国宝宝体质的CPC比赛 此时压力给到了我们队o((⊙﹏⊙

    2024年02月05日
    浏览(48)
  • 有趣的数学 数学建模入门二 一些理论基础

             现实世界中混乱的问题可以用数学来解决,从而产生一系列可能的解决方案来帮助指导决策。大多数人对数学建模的概念感到不舒服,因为它是如此开放。如此多的未知信息似乎令人望而却步。哪些因素最相关?但正是现实世界问题的这种开放性导致了解决问题

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包