为初步理解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;
}