JNI:从Java程序中调用C函数

本文详细介绍了如何使用Java Native Interface (JNI)从Java调用C语言代码。步骤包括创建Java类、编译、生成头文件、C代码实现、编译为动态链接库以及在Java中加载和调用。特别关注了Linux环境下生成.so文件的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://www.jianshu.com/p/4be6274cf188https://blog.youkuaiyun.com/xiaoxiaoyusheng2012/article/details/56672173.

第五部分生成动态连接略有改动。

1、创建java类,建议不要加包名,省的后面找不到类(我之前加了包名,导致后面各种找不到或无法加载主类。。)


public class HelloNative {

    public static native void greeting();

    static {

        System.loadLibrary("hellonative");

    }

    public static void main(String[] args) {

        HelloNative.greeting();

    }

}

greeting方法就是我们要用C语言实现的方法,如果有参数的话,在函数中添加参数。

System.loadLibrary用于加载动态链接库。

2、编译这个类。
javac HelloNative.java

3、调用javah来生成头文件HelloNative.h
javah -jni HelloNative

HelloNative.h:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloNative
 * Method:    greeting
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

4、在HelloNative.c中给出函数的实现代码。
HelloNative.c

#include "HelloNative.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv * env, jclass jcl){
    printf("Hello Native !\n");
    return;
}

5、将C代码编译到动态链接库中。(Linux环境,生成.so文件)

gcc -fPIC -dynamiclib -I /home/yzheng/soft/jdk1.8.0_131/include HelloNative.c -shared -o libhellonative.so

其中,JDK的目录各位读者请自行调整。
gcc的-I选项指定寻找头文件的目录,主要是由于HelloNative.h中有一行
#include <jni.h>,而jni.h这个文件就在
/home/yzheng/soft/jdk1.8.0_131/include目录下面。
同理,由于jni.h里面有一行#include "jni_md.h"
如果/home/yzheng/soft/jdk1.8.0_131/include目录下面没有jni_md.h,则会报下面错误:

Cannot open include file: 'jni_md.h': No such file or directory

这时候把/home/yzheng/soft/jdk1.8.0_131/include/linux/下的jni_md.h拷贝到
/home/yzheng/soft/jdk1.8.0_131/include
目录里面即可。
gcc编译成功后,就会得到libhellonative.so这个文件。
在HelloNative.java文件中,有一行代码:

System.loadLibrary("hellonative");

就是用来加载libhellonative.jnilib的。
注意:在执行gcc命令时,-o libhellonative.jnilib中,hellonative前面的lib不可以缺少!!!
否则,会报no XXX in java.library.path错误。

6、执行java HelloNative,打印Hello Native !调用成功。

如果不成功,仍然报no XXX in java.library.path错误,请使用如下命令手动指定动态链接文件的路径:

java -Djava.library.path=/home/yzheng/spectre/java HelloNative

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大模型发展与战略研究中心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值