Java与其他语言的集成:桥梁、JNI和GraalVM

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java的必备工具包:如何让“咖啡”与Python、C++和JavaScript友好相处

\n

编程世界并非单一技术的修道院。即使你的心随着Java的节奏跳动,迟早也会遇到一个任务,这个任务用其他语言解决更简单(甚至只能如此)。你需要调用一个用C++编写的底层库,用Python快速原型化一个模型,或者嵌入一个脚本引擎用于用户自定义宏。该怎么办?没错——搭建桥梁。

\n

在本文中,我们将探讨Java与其他语言集成的真实、经过验证的方法。从经典的JNI到未来主义的GraalVM,再到简单但可靠的IPC。没有废话——只有代码、基准测试和实用建议。开始吧!

\n\n

1. JNI(Java本地接口)——集成的鼻祖

\n

JNI(Java Native Interface)是一种标准机制,允许Java代码调用本地应用程序(通常是C/C++),反之亦然。它从Java的第一个版本就存在,至今仍然是集成的最快方式,如果你需要与硬件、系统调用或遗留库交互的话。

\n\n

它是如何工作的(非常简要)

\n

你编写一个带有native关键字的Java接口,使用javac -h工具生成C头文件,用C实现函数,编译成动态库(.so / .dll),然后通过System.loadLibrary()加载。

\n\n

示例:从Java调用C函数

\n

假设我们有一个用C编写的超快速函数,用于计算SHA-256哈希。我们需要从Java中调用它。

\n\n

步骤1. Java类(HashBridge.java)

\n
public class HashBridge {\n    static {\n        System.loadLibrary("nativehash");\n    }\n\n    // 声明本地方法\n    public native String computeHash(String input);\n\n    public static void main(String[] args) {\n        HashBridge bridge = new HashBridge();\n        String result = bridge.computeHash("Hello from Java!");\n        System.out.println("Hash: " + result);\n    }\n}\n
\n\n

步骤2. 生成头文件

\n
javac -h . HashBridge.java\n
\n

得到包含签名的文件HashBridge.h。

\n\n

步骤3. C语言实现(nativehash.c)

\n
#include <jni.h>\n#include <string.h>\n#include <openssl/sha.h>\n\nJNIEXPORT jstring JNICALL Java_HashBridge_computeHash(JNIEnv *env, jobject obj, jstring input) {\n    const char *nativeString = (*env)->GetStringUTFChars(env, input, 0);\n    unsigned char hash[SHA256_DIGEST_LENGTH];\n    SHA256((unsigned char*)nativeString, strlen(nativeString), hash);\n\n    char hex[65];\n    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {\n        sprintf(hex + (i * 2), "%02x", hash[i]);\n    }\n    hex[64] = 0;\n\n    (*env)->ReleaseStringUTFChars(env, input, nativeString);\n    return (*env)->NewStringUTF(env, hex);\n}\n
\n\n

步骤4. 编译并运行

\n
gcc -shared -o libnativehash.so -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux nativehash.c -lcrypto\njava HashBridge\n
\n\n

输出: Hash: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

\n\n

JNI的优缺点

\n
    \n
  • ✅ 最高性能 — 直接调用本地代码,无额外开销。
  • \n
  • ✅ 访问系统API — 驱动程序、GPU、操作系统特定功能。
  • \n
  • ❌ 调试困难 — C语言中的错误可能导致JVM崩溃且无堆栈跟踪。
  • \n
  • ❌ 平台绑定 — 需要为每个操作系统/架构编译。
  • \n
  • ❌ 代码繁琐 — 用C编写JNI包装代码可不是什么愉快的体验。
  • \n
\n\n

2. GraalVM — 多语言瑞士军刀

\n

博客

书籍推荐