JAVA调用C语言程序
- JAVA调用C语言程序
- 1. 编写带有native声明的方法的Java类
- 2. 使用javah 生成:jniSample.h的头文件
- 3. 使用C实现本地sum方法:(这里我生成文件时候,误写了jinSample)。
- 4. 将本地方法编写的文件生成动态链接库。
- 5. 再次刷新项目,再使用jniSample.java文件运行代码,得到结果。
JNI:
java Native INterface:JAVA原生数据库
java与C互操作
C调用JAVA程序(基于反射的方法)
JAVA调用C语言程序
JNI实现native方法
本次操作在Mac上,使用eclipse编写java,使用xcode运行c代码,xcode中可以使用gcc。
课程是MOOC上JAVA相关课程。
(这里的compile.cmd文件可不关心,我用来存放,第四部步骤的相关命令的)
1. 编写带有native声明的方法的Java类
use javah -cp bin jniSample we can get jniSample.h file.
public class jniSample {
//要在C中实现的方法sum。
public native int sum(int a, int b);
public static void main(String[] args) {
//加载共享库文件libjniSample.jnilib文件。
System.loadLibrary("jniSample");
jniSample sample = new jniSample();
int Sum = sample.sum(5, 6);
System.out.println(Sum);
}
}
2. 使用javah 生成:jniSample.h的头文件
use javah -cp bin jniSample we can get jniSample.h file.
在终端,先切换到项目文件夹下:
执行:
javah -cp bin jniSample
刷新项目:在eclipse中,右键项目,refresh即可。得到jniSample,该文件无需更改。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jniSample */
#ifndef _Included_jniSample
#define _Included_jniSample
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jniSample
* Method: sum
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_jniSample_sum
(JNIEnv *, jobject, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
3. 使用C实现本地sum方法:(这里我生成文件时候,误写了jinSample)。
#include "jinSample.h"
JNIEXPORT jint JNICALL Java_jniSample_sum
(JNIEnv *env, jobject obj, jint num1, jint num2){
return num1*num2;
}
void main(){}
4. 将本地方法编写的文件生成动态链接库。
mac下使用gcc生成动态链接库文件
使用: 查看jdk路径
/usr/libexec/java_home -V
再将自己的jdk路径改下,以下是我的jdk路径。
gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/ jinSample.c -o libjniSample.jnilib
提示错误:
/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/jni.h:45:10: fatal error:
'jni_md.h' file not found
使用下列命令copy一份。在运行上述代码。
sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include
5. 再次刷新项目,再使用jniSample.java文件运行代码,得到结果。
30
注意:
这里java文件中加载jniSample.jnilib文件。写的是"jniSample"。但是第四步骤中,写的是:libjniSample.jnilib。该名称前加上:lib。不如运行java代码调用本地sum方法时会报错。