跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Linux 下 Java JNI 调用 .so 文件的方法

Java JNI 技术允许 Java 程序在 Linux 系统下直接调用本地 C/C++ 编译生成的 .so 动态链接库。实现过程包括编写 Java 类声明 native 方法,使用 javah 生成头文件,编写对应的 C 代码实现逻辑,并通过 gcc 编译为共享库。运行前需配置 LD_LIBRARY_PATH 环境变量或使用绝对路径加载库文件,同时需注意 jstring 类型与 C 字符串之间的正确转换以避免内存问题。

GitMaster发布于 2013/5/27更新于 2026/7/2255 浏览
Linux 下 Java JNI 调用 .so 文件的方法

Linux 下 Java JNI 调用 .so 文件的方法

刚刚试过一个这样的例子,省事起见,略改并记录如下:

1. Java 类编写
public class Hello {
    static {
        System.loadLibrary("goodluck");
    }

    public static native int get();
    public static native void set(int i, String s);

    public static void main(String[] args) {
        try {
            Hello test = new Hello();
            test.set(10, "5555");
            System.out.println(test.get());
        } catch (Exception ex) {
            System.out.println("ssssss");
        }
    }
}

OK Java 类有了。

执行:

javac Hello.java

上面成功后,再执行下面生成头文件:

javah Hello

生成了 Hello.h

2. C 语言实现

编写 Hello.c:

#include "Hello.h"

int i = 0;

JNIEXPORT jint JNICALL Java_Hello_get {
     i;
}

JNIEXPORT  JNICALL  {
     *tsetstr = ( *)(*env)->GetStringUTFChars(env, s, ); 
    (, tsetstr);
    i = j;
}
(JNIEnv *env, jclass jc)
return
void
Java_Hello_set
(JNIEnv *env, jclass jc, jint j, jstring s)
char
char
NULL
// 注意此处 jstring 和 char *的转换
printf
"%s--------\n"

保存,然后执行如下编译指令:

gcc -fPIC -D_REENTRANT -I/usr/java/jdk1.6.0_31/include -I/usr/java/jdk1.6.0_31/include/linux -c Hello.c
gcc -shared Hello.o -o libgoodluck.so

此时就生成了 libgoodluck.so。

注意为了让 Java 找到此 so,运行:

export LD_LIBRARY_PATH=.

将当前目录(so 文件目录,不包括文件名)加入此环境变量。

然后运行 java Hello,屏幕上打出了 10。

然后测试下传入 String 型的参数,对应的 JNI 定义应为 jstring,但却出了些问题,在显示结果时仿佛内存溢出的样子。

后来查了查,需对 jstring 和 char *作一个转换,如代码中所示,然后结果就正常。

补充说明
  1. 将编写的 Hello.c 文件编译成 .o 文件:
gcc -fPIC -D_REENTRANT -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include -I/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux -c Hello.c

注:/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include 是 jni.h 头文件所在的路径,/usr/lib/jvm/java-1.5.0-sun-1.5.0.19/include/linux 是 jni_md.h 所在的路径。

  1. 将生成的 Hello.o 文件编译成 .so 库文件:
gcc -shared Hello.o -o libgoodluck.so

注: 和 Windows 下不同,Linux 的库文件必须是以 libxxx.so 形式命名的(或者 libxxx.so.y,y 是版本号),lib 前缀是为了系统能够识别它,xxx 是 Java 代码 System.loadLibrary("xxx"); 中引用库的名字。

将生成的 libgoodluck.so 文件拷贝到 Java 的加载库 LD_LIBRARY_PATH 指向的路径中。 前提是你有足够的权限,如果没有 sudo 权限的同学,用下面的方法:

  1. 在 /home 下建立一个用来存放 .so 库文件的目录,比如 ./jni_lib
  2. 把 libgoodluck.so 文件拷贝到该目录下
  3. 打开 Terminal,运行如下命令:
export LD_LIBRARY_PATH=./jni_lib

只在当前 shell 下有效...

另外, 以下方法可以直接利用绝对路径来 load 这个 so 库文件,从而无需做上述的放置 path 或者更改库路径的动作:

static { System.load("./jni_lib/libgoodluck.so"); }

目录

  1. Linux 下 Java JNI 调用 .so 文件的方法
  2. 1. Java 类编写
  3. 2. C 语言实现
  4. 补充说明
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 算法性能优化实战:从瓶颈定位到效率提升
  • C++ 四种类型转换详解:static_cast、reinterpret_cast、const_cast 与 dynamic_cast
  • AI 大模型工程师职业前景与转行指南
  • Ollama 部署与运行 HuggingFace 开源模型指南
  • 前端状态管理方案对比与选型指南
  • 前端核心面试题深度解析:从原理到实战
  • 数学建模竞赛编程手必备技能与工具选择
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • 基于 Spring Boot 的学生成绩管理系统设计与实现
  • 多模态大模型原理与跨模态应用实战
  • HTML5 结合 AI 实现智能场景渲染与应用
  • 数据结构复习:线性表(顺序表)实现与刷题
  • Java 泛型核心概念与用法详解
  • OpenCode 开源 AI 编程助手实战指南
  • C++26 契约编程深度解析:异常安全与契约设计法则
  • Rust 核心基础数据类型与变量系统详解
  • 《GPT 图解大模型是怎样构建的》技术解析与学习指南
  • C++二叉搜索树:核心特性、实现与性能分析
  • C++ 哈希表原理与 unordered 容器详解
  • 现代 C++ 构建高性能 HTTP 服务器设计与实现

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online