Linux下生成so,使用JNI调用C/C++程序

本文通过一个具体例子详细介绍了如何使用Java Native Interface (JNI)来连接Java和C代码。从创建Java类到生成本地方法的头文件,再到实现这些方法的C源文件,并最终编译为动态链接库(.so文件),文章提供了完整的步骤说明。此外还展示了如何在Java程序中加载并使用这个动态链接库。

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

以com.company.JniLib.java文件为例

package com.company;
public class JniLib {

    public native void setFlagStr(String str);

    public native String getFlagStr();

}
第一步,生成头文件,必须要把这个java文件放到com/company的目录下,然后再在根目录下编译
javah -classpath . com.company.JniLib.java 

第二步,编写com_company_JniLib.c文件

#include<stdio.h>
#include<jni.h>
#include "com_company_JniLib.h"
const char * str;
JNIEXPORT void JNICALL Java_com_company_JniLib_setFlagStr(JNIEnv * env, jobject j, jstring s)
{
	str = (*env)->GetStringUTFChars(env, s, 0);;
}
JNIEXPORT jstring JNICALL Java_com_company_JniLib_getFlagStr(JNIEnv * env, jobject j)
{
	return  (*env)->NewStringUTF(env, str);
}

第三步,编译生成so文件

gcc -fPIC -I /usr/java/include -I /usr/java/include/linux -c com_company_JniLib.c
gcc -shared com_company_JniLib.o -o jnilib.so

第四步,程序中调用so文件

public class Main {

    static {
        System.load("/root/jni/jnilib.so");
    }

    public static void main(String[] args) {
        JniLib lib = new JniLib();
        lib.setFlagStr("值1000大洋的“hello world”!");
        System.out.println(lib.getFlagStr());
    }

}

程序需要在linux下才能运行,打包成jar,执行效果如下:



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值