<a target="_blank" href="http://blog.51cto.com/attachment/201202/203929272.jpg"></a>
1,JNI的原理图
<a target="_blank" href="http://blog.51cto.com/attachment/201202/204356155.png"></a>
直接到官方教程那里截的….
package kg.tom;
public class MyJni {
//使用JNI的关键字native
//这个关键字决定我们那些方法能在我们的C文件中使用
//只须声明,不必实现
public native void display();
public native double sum(double x,double y);
//这个是到时候调用我们写好的C文件
//现在用不上
//static {
// System.loadLibrary("sum");
//}
public static void main(String[] args) {
//到时候测试用方法现在用不上
//new MyJni().display();
//System.out.println(new MyJni().sum(2.0, 3.0));
}}
然后,就是返回到我们的java基础了…将我们写好的类,转换成头文件
<a href="http://blog.51cto.com/attachment/201202/204825152.png" target="_blank"></a>
2,把.class文件转换成头文件,成功的话就会在src目录下看到.h文件了
打开后你会看到
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class kg_tom_MyJni */
#ifndef _Included_kg_tom_MyJni
#define _Included_kg_tom_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: kg_tom_MyJni
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_kg_tom_MyJni_display
(JNIEnv *, jobject);
* Method: sum
* Signature: (DD)D
JNIEXPORT jdouble JNICALL Java_kg_tom_MyJni_sum
(JNIEnv *, jobject, jdouble, jdouble);
#ifdef __cplusplus}
#endif
native方法名称转换详解:
<a href="http://blog.51cto.com/attachment/201202/205922606.jpg" target="_blank"></a>
3,就是写我们的C文件了
//必须的头文件jni.h
//导入我们需要实现的本地方法#include "kg_tom_MyJni.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_kg_tom_MyJni_display
(JNIEnv *env, jobject obj){
printf("Hello World tom!!");
return;}
(JNIEnv *env, jobject obj, jdouble a, jdouble b){
return a + b;}
找到我们的jdk文件夹,然后打开其中的include文件夹,就会看到一些头文件,看下关键的Jni.h头文件在不在,在的话,继续,不在
自行下载一个新的jdk…
我们这里使用mingw….你会用VC6也可以用VC6编译…
gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Id:/java/include –Id:/java/include/win32 -shared -o sum.dll java_sum_native.c
<a href="http://blog.51cto.com/attachment/201202/210121580.png" target="_blank"></a>
没出什么提示的话就是成功的了…
//把刚才注释的地方删掉..
//这就是必须的,用来读取我们写好的C语言编译好的dll,后缀是系统自己辨认…千万不要自己写
static {
System.loadLibrary("sum");
}
//mian方法中
//用底层c代码实现输出..呵呵~~
new MyJni().display();
//用c计算会不会快点呢..呵呵~
System.out.println(new MyJni().sum(2.0, 3.0));
输出结果
<a href="http://blog.51cto.com/attachment/201202/210248676.png" target="_blank"></a>
貌似java本身的输出,优先级比较高??
1,我们要运行我们编译的C文件,是与我们创建的类是必须一起存在,
例如:我把MyJni.java删掉,然后另起一个Hello.java能不能直接调用dll中的方法呢?那是肯定不行的..因为,jni需要类名来进行查找
本文转自 liam2199 博客,原文链接: http://blog.51cto.com/youxilua/773024 如需转载请自行联系原作者