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文件可不关心,我用来存放,第四部步骤的相关命令的)

java可以调用c语言吗 java中调用c语言的程序_Java

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方法时会报错。