文章目录

  • 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 fileoptions[0].optionString = "-Djava.class.path=./Adder.jar";// Set the Java VM argumentsvm_args.version = JNI_VERSION_1_8;vm_args.nOptions = 1;vm_args.options = options;vm_args.ignoreUnrecognized = JNI_FALSE;// Create the Java VMJNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);// Get a reference to the Adder classadder_class = (*env)->FindClass(env, "Adder");// Get a reference to the add method of the Adder classadd_method = (*env)->GetMethodID(env, adder_class, "add", "(II)I");// Call the add method of the Adder classresult = (*env)->CallIntMethod(env, (*env)->NewObject(env, adder_class, (*env)->GetMethodID(env, adder_class, "<init>", "()V")), add_method, 1, 2);// Print the resultprintf("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核心技术第12版开发基础+高级特性(套装共2册)

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

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


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

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

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


Java编程思想[Thinking in Java]

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

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


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语言程序设计基础篇+进阶篇(原书第12版)(套装共2册)

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

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


Java并发编程实战

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

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


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

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

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


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

4 更多分享

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

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

  1. JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库

    JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 JAVA毕业设计vue开发一个简单音乐播放器计算机源码+lw文档+系统+调试部署+数据库 本源码技术栈: 项目 ...

  2. java中UPD的一个简单的例子

    import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public ...

  3. java调用javafx_Java代码调用JavaFX的例子(大力推荐)

    在JavaFX 1.0发布之后,本人撰写的文章JavaFX和Java之间的互操作性被各网站转载.文中总结了3种从Java调用JavaFX的方法.这三种方法分别为: http://www.javafxb ...

  4. java mongodb存base64_阿里JAVA面试分享经验【文末有福利】

    基础篇 参考这里的面试题:面试题写在后面了 能回答上百分之七十,基础的广度就算OK了.如果达不到,那么缺什么就赶紧补什么.广度达到了,还需要对个别热点问题有深度.每个人的精力都有限,可以适当挑选两个热 ...

  5. 文末有福利 | 停不下来!程序员在GitHub上开源了一个自制表情包项目

    世界上本没有表情包,脑洞大的人多了,便有了表情包,如今,大家伙聊天都离不开表情包,但是手头上很多时候表情包根本不够用,所以市面上就有很有App.小程序可以帮助你制作专属你的表情包 而程序员在这方面就有 ...

  6. python两层循环 循环完整体一个_Python编写循环的两个建议 | 鹅厂实战(文末有福利)...

    循环是一种常用的程序控制结构.我们常说,机器相比人类的最大优点之一,就是机器可以不眠不休的重复做某件事情,但人却不行.而**"循环"**,则是实现让机器不断重复工作的关键概念. 在 ...

  7. 大家好,我是一个“不一样的”程序员。奥,文末锦鲤彩蛋~

    很困.很忙 有时随性.有时时尚 有趣.有脾气 可能跟你想象的有些不同 但我真是一名可爱.光荣.内心会打小九九的程序员 上班 - 下班 上班 晚上加班,周末加班 节假日当然也要加班 服务器崩溃要加班 服 ...

  8. Java面试题2021,文末有福利

    正文 做了 3~5 年编程开发,你已经积累了不少项目经验,扩宽了技术广度,也许已发力成为团队管理者.到了这个阶段,大家却常有这种感受:感觉自己卡在瓶颈进步缓慢,技术水平很难像早期一样实现大幅突破? 其 ...

  9. 如何制作一个高转化的广告落地页(文末有福利)

    在这个用户红利期逐渐消失的网络信息化年代,流量越来越贵,转化率越来越重要,因而落地页的重要性就凸显出来. 对于广告优化师/广告运营来说,制作广告落地页是必备技能,但制作一个高转化的广告落地页就是加分项 ...

最新文章

  1. webpack、rollup、parcel 它们的优劣?_尾货批发与正价批发优劣势,你有二者兼顾吗?...
  2. Java集合之ArrayList源码解析
  3. 探索区块链-挖框体验
  4. ELK 5.X版本遇到的坑
  5. linux vim五则运算编程,第3章--vi-vim编辑器的使用.ppt
  6. Spring Schedule关闭订单
  7. 加速度和陀螺仪 日常活动识别 跌倒检测_巢湖房屋安全检测,幼儿园房屋质量检测新趋势-房屋鉴定专业团队...
  8. InstallShield 2011新功能试用(9)- 安装包大小压缩
  9. pdf在线翻译_如何将英文的PDF文档翻译成中文简体?
  10. English Voice of Way Back Into Love
  11. C++判断一个序列是否为堆(最大堆、最小堆)
  12. ECMAScript 5.0 基础语法(上)
  13. C语言:编写一个程序,输入用户的姓名和电话号码,按姓名的词典顺序排序后,输出用户的姓和电话号码;
  14. discuz!net 的使用
  15. JSP技术-02-内置对象/作用域/EL表达式/JSTL标签库
  16. 多表连接查询和多次单表查询哪个效率高
  17. 巴菲特致股东的一封信:1996年
  18. Repeating Annotations
  19. 概率论中常见分布的数学期望、方差及特征函数推导 (一)离散型随机变量
  20. 字节跳动取消大小周;淘宝、支付宝等阿里系App取消开屏广告;Python 3.10 beta 4发布

热门文章

  1. 登录页面的--表单提交
  2. 【C#】身份证识别(一):身份证号定位
  3. win10删除休眠文件的方法是什么_windows10休眠文件怎么删除
  4. Rotation Proposals
  5. 如何统计分析CSDN博客流量
  6. 关于 X-Forward-
  7. php mysql 报错_Mac下PHP连接MySQL报错"No such file or directory"的解决办法
  8. textarea 标签 属性
  9. 11203RAC升级到11204RAC
  10. 双币对冲套利-EA【优化版】最安全,最稳定非对冲套利莫属