C_C++_Java Java利用JNI调用C的函数

大神博客:http://blog.sina.com.cn/s/blog_4bb52a1601012x8j.html

主要步骤

一 声明一个Java类,将其中的需要C实现的函数声明为native

二 用javac 编译 .java文件生成一个 .class文件

三 用javah 编译 生成C/C++的头文件.h

四 创建动态链接库项目并包含必要的java的.h文件

注意事项--

1.头文件中包含了jni.h头文件,所以需要将jdk安装目录下include文件夹下的jni.h头文件

include\win32文件夹下的jawt_md.hjni_md.h头文件拷贝到visual studio的安装目录下vc\include文件夹下。

我的路径是:C:\Program Files\Microsoft Visual Studio 9.0\VC\include

也可以把jdk下的那三个头文件拷贝到vc++的项目目录下,

编写C函数代码实现头文件中声明的函数。

2.注意编译运行的平台根据需要使用32或64位


.java文件

public class test {
	static {
		System.loadLibrary("Test_k");
	}

	public native static int get();

	public native static void set(int i);

	public static void main(String[] args) {
		test test = new test();
		test.set(10);
		System.out.println(test.get());
	}
}

.h文件

懒 jni.h等文件 没拷贝到库文件中,直接拷贝到项目中

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

#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     test
 * Method:    get
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_test_get
  (JNIEnv *, jclass);

/*
 * Class:     test
 * Method:    set
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_test_set
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif


1.其中 jint 在VS2013下为 long 类型

2.





实现部分

#include "test.h"

int i = 0;

JNIEXPORT jint JNICALL Java_test_get
(JNIEnv *, jclass){
	return i;
}

JNIEXPORT void JNICALL Java_test_set
(JNIEnv *, jclass, jint j){
	i = j;
}


生成的动态链接库

最少执行.class文件 ,只需要两个文件 .class文件和动态链接库 .dll 文件



C_C++_Java Java利用JNI调用C的函数_第1张图片

你可能感兴趣的:(java,jni,C语言,native)