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岁了】一个有趣的例子,再推荐一些经典好书(文末惊喜福利)-LMLPHP

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

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

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


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

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

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

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


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

Java编程思想[Thinking in Java]

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


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

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

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


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

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

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


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

Java并发编程实战

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


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

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

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


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

4 更多分享

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

05-24 02:57