首页 > 代码库 > Java通过JNI调用C的一个小DEMO

Java通过JNI调用C的一个小DEMO

    最近看java源代码,发现很多方法用native修饰,那么什么是native方法呢?

    简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。

    JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

    使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。

JNI(Java Native Interface)的书写步骤:

     1、编写带有native声明的方法的java类
     2、使用javac命令编译所编写的java类
     3、使用javah ?jni java类名生成扩展名为h的头文件
     4、用C/C++(或者其他编程想语言)实现本地方法
     5、将C/C++编写的文件生成动态连接库

下面我们通过一个小案例来讲解java如何通过JNI调用C中的方法:

1. 编写java代码,代码如下:

package com.xiaomo.jni;

public class JNI_Test {
	
	public native void showStr(String name);
	
	public native void add(int a,int b);
	
	public native int combineStr(int a,int b);
	
	static{
		System.loadLibrary("JNI_DLL");
	}
	
	public static void main(String[] args) throws InterruptedException {
		JNI_Test jni = new JNI_Test();
		jni.showStr("Hello!");
		jni.add(1, 2);
		Thread.sleep(5000);
		System.out.println(jni.combineStr(5, 2));
	}

}

2. 编译成.class文件,记得要配置环境变量哦,不会配置的童鞋自己去补充下课外知识吧╮(╯▽╰)╭。

3. 生成.h文件 :javah –jni  com.xiaomo.jni.JNI_Test 会在JNI_Test的包目录下找到com_xiaomo_jni_JNI_Test.h文件


注意:带有package的类要返回到包的根目录才能调用javah命令,否则会找不到类文件!(在这里跌倒过╮(╯▽╰)╭)

4. 生成.dll文件

1) 打开Visual c++ 6.0,选择 文件->新建->工程(选择Win32 Dynamic-Link Library->确定->空白的dll工程->完成。 



2) 选择 工具->选项->目录(添加目录JDK安装目录下的INCLUDEINCLUDE\WIN32两个目录)


com_xiaomo_jni_JNI_Test.h拷贝到新建的工程文件夹中。

3) 添加源文件JNI_Test.cpp,并完成要实现的本地方法:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include "com_xiaomo_jni_JNI_Test.h"
#include <stdio.h>
/*
 * Class:     com_xiaomo_jni_JNI_Test
 * Method:    showStr
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_xiaomo_jni_JNI_1Test_showStr
  (JNIEnv * env , jobject obj, jstring str)
{
	printf("%s\n",&str);
}

/*
 * Class:     com_xiaomo_jni_JNI_Test
 * Method:    add
 * Signature: (II)V
 */
JNIEXPORT void JNICALL Java_com_xiaomo_jni_JNI_1Test_add
(JNIEnv * env, jobject obj, jint a, jint b)
{
	int sum = a + b;
	printf("%d",sum);
}

JNIEXPORT jint JNICALL Java_com_xiaomo_jni_JNI_1Test_combineStr
  (JNIEnv * env, jobject obj, jint a, jint b)
{
	int sum = a + b;
	return sum;
}

5. 这样在C++工程下就生成了一个JNI_Test.dll文件(在工程下debug文件夹下)



6. 将JNI_Test.dll文件复制进JDK安装目录下的bin文件夹里,运行java com.xiaomo.jni.JNI_Test 控制台打印(乱码的问题这里就不说了,自己慢慢研究吧╮(╯▽╰)╭):



作者:伫望碧落 出处:http://blog.csdn.net/cl05300629

Java通过JNI调用C的一个小DEMO