用Java调用C语言代码实例(JNI)

为初步理解Java中native本地方法的使用,提出使用native方法实现计算任意正整数二进制的需求(native方法是Java中的本地方法,一般采用C/C++通过JNI(Java native interface)实现)。

JNI编写流程:

1.编写带有native声明的方法的java类
2.使用javac命令编译所编写的java类
3.然后使用javah + java类名生成扩展名为h的头文件
4.使用C/C++实现本地方法
5.将C/C++编写的文件生成动态连接库
6.运行java工程并调用JNI

1. Java编写测试代码:

public class Domain
{
	public static void main(String [] args){
		System.loadLibrary("Counter"); //Counter为C/C++编写的动态链接库
		Tools.binaryCount(100);
	}
}


2.编写带有native声明的方法的java类

public class Tools
{
	protected static native void binaryCount(int num);
}

使用javac Tools.java编译为Tools.class文件

3.通过javah -jni Tools生成Tools.h文件



点击查看Tools.h文件

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

#ifndef _Included_Tools
#define _Included_Tools
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Tools
 * Method:    binaryCount
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_Tools_binaryCount
  (JNIEnv *, jclass, jint);//需要实现的方法名

#ifdef __cplusplus
}
#endif
#endif

4.打开DevC++,新建dll类型的C语言实现的项目Counter(删除项目自带的两个文件)

5.使用C/C++实现本地方法

#include <windows.h> 
#include <stdlib.h>  
#include <stdio.h>  
#include "Tools.h" 
#include "stack.h"
#include "stack.c" 


JNIEXPORT void JNICALL Java_Tools_binaryCount(JNIEnv *env, jclass obj, jint i) 
{               
	struct stack *s=NULL;
	s=stack_init();

	int k;

	while(i>0){
		k=i%2;
		stack_push(s,k);
		i=i/2;	
	}
	
	printf("The binary of the %d is:",i);
	while(!stack_isempty(s)){
		printf("%d ",stack_pop(s));
	}
	stack_free(s);

	return;
}

6.将C/C++编写的文件生成动态连接库

右键项目->项目属性->文件/目录->包含文件目录 将JDK下include目录和include目录下的win32文件添加

编译Counter项目

7.运行Java项目并调用JNI

原文地址:https://www.cnblogs.com/miaowulj/p/14738956.html