首页 > 代码库 > 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++编写的文件生成动态连接库
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安装目录下的INCLUDE和INCLUDE\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