当前位置:首页 > Java

java如何用native

2026-03-21 02:10:47Java

使用 JNI(Java Native Interface)调用本地方法

在 Java 中通过 JNI 调用本地(Native)方法,通常需要以下步骤:

编写 Java 类并声明 native 方法

创建一个 Java 类,声明 native 方法并使用 native 关键字。例如:

public class NativeExample {
    // 声明 native 方法
    public native void sayHello();

    // 加载动态链接库
    static {
        System.loadLibrary("NativeExample");
    }

    public static void main(String[] args) {
        new NativeExample().sayHello();
    }
}

生成头文件

使用 javac 编译 Java 类,并通过 javah(Java 8 及以下)或 javac -h(Java 9 及以上)生成 C/C++ 头文件:

javac NativeExample.java
# Java 8 及以下
javah -jni NativeExample
# Java 9 及以上
javac -h . NativeExample.java

这会生成一个头文件(如 NativeExample.h),内容类似:

java如何用native

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

#ifndef _Included_NativeExample
#define _Included_NativeExample
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativeExample
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_NativeExample_sayHello(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

实现本地方法

编写 C/C++ 文件实现 native 方法。例如 NativeExample.c

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

JNIEXPORT void JNICALL Java_NativeExample_sayHello(JNIEnv *env, jobject obj) {
    printf("Hello from Native Code!\n");
}

编译本地代码为动态库

根据操作系统编译动态链接库:

  • Windows(生成 .dll 文件):

    java如何用native

    gcc -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o NativeExample.dll NativeExample.c
  • Linux/macOS(生成 .so.dylib 文件):

    gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -shared -o libNativeExample.so NativeExample.c

运行 Java 程序

确保动态库在 Java 的库路径中(通过 -Djava.library.path 指定),然后运行程序:

java -Djava.library.path=. NativeExample

输出应为:

Hello from Native Code!

注意事项

  • 动态库名称需与 System.loadLibrary() 中指定的名称一致(Windows 省略 .dll,Linux/macOS 省略 lib 前缀和 .so/.dylib 后缀)。
  • 跨平台时需为不同操作系统编译对应的动态库。
  • 确保 JAVA_HOME 环境变量正确配置,指向 JDK 安装路径。

通过以上步骤,可以实现 Java 调用本地代码的功能。

标签: 如何用java
分享给朋友:

相关文章

java如何读取文件

java如何读取文件

读取文件的常用方法 Java提供了多种读取文件的方式,适用于不同场景和需求。以下是几种常见的方法: 使用FileInputStream和BufferedInputStream读取二进制文件 try…

java如何上传文件

java如何上传文件

使用HttpURLConnection上传文件 在Java中,可以通过HttpURLConnection实现文件上传功能。需要设置请求头为multipart/form-data,并构建包含文件数据的请…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Thread…

java如何导入jar包

java如何导入jar包

在Eclipse中导入JAR包 右键项目 -> 选择"Properties" -> 左侧导航选择"Java Build Path" -> 切换到"Libraries"标签 ->…

java程序如何打包

java程序如何打包

打包Java程序的方法 使用JAR打包 Java程序可以通过JAR(Java Archive)格式打包,这是一种常见的压缩格式,适用于包含多个类文件和资源的项目。以下是使用JAR打包的步骤: 确保项…

php 实现 java md5加密

php 实现 java md5加密

PHP 实现 Java MD5 加密 Java 和 PHP 的 MD5 加密结果可能存在差异,主要由于字符编码和输出格式的不同。以下是确保 PHP 与 Java MD5 加密结果一致的方法。 确保字…