java如何调用c程序
Java调用C程序的实现方法
Java通过JNI(Java Native Interface)技术调用C程序,以下是具体步骤和示例:
编写Java类并声明native方法
创建Java类,使用native关键字声明需要调用的C函数:
public class NativeDemo {
// 声明native方法
public native void helloFromC();
// 加载动态链接库
static {
System.loadLibrary("NativeDemo");
}
public static void main(String[] args) {
new NativeDemo().helloFromC();
}
}
生成C语言头文件
使用javac和javah工具生成头文件:

javac NativeDemo.java
javah -jni NativeDemo
这会生成NativeDemo.h头文件,包含需要实现的函数声明。
实现C语言函数
根据生成的头文件编写C实现(NativeDemo.c):

#include <jni.h>
#include "NativeDemo.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_NativeDemo_helloFromC(JNIEnv *env, jobject obj) {
printf("Hello from C!\n");
return;
}
编译C代码为动态库
不同平台的编译方式:
- Windows(使用MinGW):
gcc -shared -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -o NativeDemo.dll NativeDemo.c - Linux/macOS:
gcc -shared -fPIC -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -o libNativeDemo.so NativeDemo.c
运行Java程序
确保动态库在java.library.path路径中,然后执行:
java -Djava.library.path=. NativeDemo
参数传递与返回值处理
基本类型可以直接映射,对象类型需要通过JNI函数处理:
// Java端
public native int add(int a, int b);
// C端实现
JNIEXPORT jint JNICALL Java_NativeDemo_add(JNIEnv *env, jobject obj, jint a, jint b) {
return a + b;
}
注意事项
- 确保Java和C的位数一致(32/64位)
- 路径和库名需正确匹配
- 跨平台时需要为不同系统编译对应的动态库
- 资源管理需谨慎,避免内存泄漏






